diff --git a/tools/pyboard.py b/tools/pyboard.py
index 3ce6da5215430a03707ebf55f218e8e47049b1b6..8b16f7f333dbe98751bf97aca53a246ef53c9ad7 100644
--- a/tools/pyboard.py
+++ b/tools/pyboard.py
@@ -12,6 +12,11 @@ Example usage:
     pyb.exec('pyb.Led(1).on()')
     pyb.exit_raw_repl()
 
+To run a script from the local machine on the board and print out the results:
+
+    import pyboard
+    pyboard.execfile('test.py', device='/dev/ttyACM0')
+
 """
 
 import time
@@ -45,8 +50,8 @@ class Pyboard:
 
     def exec(self, command):
         command_bytes = bytes(command, encoding='ascii')
-        for i in range(0, len(command_bytes), 10):
-            self.serial.write(command_bytes[i:min(i+10, len(command_bytes))])
+        for i in range(0, len(command_bytes), 32):
+            self.serial.write(command_bytes[i:min(i+32, len(command_bytes))])
             time.sleep(0.01)
         self.serial.write(b'\x04')
         data = self.serial.read(2)
@@ -55,19 +60,32 @@ class Pyboard:
         data = self.serial.read(2)
         while self.serial.inWaiting() > 0:
             data = data + self.serial.read(self.serial.inWaiting())
-            time.sleep(0.1)
+            time.sleep(0.01)
         if not data.endswith(b'\x04>'):
             print(data)
             raise Exception('could not exec command')
         if data.startswith(b'Traceback') or data.startswith(b'  File '):
             print(data)
             raise Exception('command failed')
-        return data[:-2]
+        return str(data[:-2], encoding='ascii')
+
+    def execfile(self, filename):
+        with open(filename) as f:
+            pyfile = f.read()
+        return self.exec(pyfile)
 
     def get_time(self):
         t = str(self.exec('pyb.time()'), encoding='ascii').strip().split()[1].split(':')
         return int(t[0]) * 3600 + int(t[1]) * 60 + int(t[2])
 
+def execfile(filename, device='/dev/ttyACM0'):
+    pyb = Pyboard(device)
+    pyb.enter_raw_repl()
+    output = pyb.execfile(filename)
+    print(output, end='')
+    pyb.exit_raw_repl()
+    pyb.close()
+
 def run_test():
     device = '/dev/ttyACM0'
     pyb = Pyboard(device)