MicroPython的交互式解释器模式又名REPL(read-eval-print-loop),就是一种命令输入交互模式,跟Python的REPL是类似的,就是在命令行直接输入Python代码或表达式执行并打印结果。关于MicroPython的REPL跟通常的Python类似又有一些不同点,下面逐一介绍一下。
要进入MicroPython的REPL环境,你需要先有一块支持MicroPython的开发板,并且开发板已经烧录了MicroPython的固件,如果是新手推荐MicroPython官网推荐的开发板。
Windows环境下推荐使用Putty,可以直接到Putty网站下载安装。
首先将开发板连接到电脑的USB接口,并且确认设备工作正常,可以通过Windows的设备管理器查看设备
是否工作正常。**注意:**不同的开发板串口号可能不一样,如果设备出现黄色的感叹号说明需要安装驱动,可以咨询下开发板的技术支持安装相应的驱动。
打开Putty,选择session节点,Connect Type选择Serial,在Serial Line文本框输入串口名,Speed输入115200,如下图:
然后,点Open按钮,即可进入到REPL的命令交互界面,如果没有显示>>>
可以按下回车:
输入help()
回车,可以打印出MicroPython的帮助信息:
快捷键 | 命令 |
---|---|
CTRL-A | 在空行状态下,进入原始REPL模式 |
CTRL-B | 在空行状态下,进入常规REPL模式 |
CTRL-C | 终止正在运行的程序 |
CTRL-D | 在空行状态下,软启动开发板 |
CTRL-E | 在空行状态下,进入粘贴模式 |
到这一步,就说明成功进入到REPL环境了。
打开终端并运行:
screen /dev/tty.usbmodem*
完成并退出屏幕后,键入 CTRL-A CTRL-\。
打开终端并运行:
screen /dev/ttyACM0
也可以尝试用 picocom
或 minicom
代替 screen
。**注意:**设备名可能不是ttyACM0,也可能是ttyACM1或更大的数字。另外,要注意是否有足够的权限来访问设备(如将 uucp 或 dialout 编为一个组,或使用 sudo)。
键入以冒号结尾的 python 语句(例如 if、for、while)时,提示符将变为三个点(…),光标将缩进 4 个空格。按回车键后,下一行将以与常规语句相同的缩进或适当的额外缩进继续。如果按退格键,则会取消一级缩进。
如果光标回到起始位置,按 RETURN 键就会执行输入的代码。下面显示的是输入 for 语句后的结果(下划线表示光标的位置):
>>> for i in range(30):
... _
如果随后输入 if 语句,将提供额外的缩进级别:
>>> for i in range(30):
if i > 3:
_
现在输入 break,接着输入 RETURN,然后按 BACKSPACE 键:
>>> for i in range(30):
if i > 3:
break
_
最后输入 print(i),按 RETURN 键,按回车键,再按一次 RETURN 键:
>>> for i in range(30):
... if i > 3:
... break
... print(i)
...
0
1
2
3
>>>
如果前两行都是空格,则不会应用自动缩进功能。可以按两次 RETURN 键来完成一个复合语句的输入,然后再按第三次 RETURN 键即可完成并执行该语句。
其实以上这些跟Python的控制台是一样的。
REPL支持自动补全,比如输入一个关键字的开头字符后按TAB键,如果输入的字符能唯一确定关键字,则自动补全关键字,如果关键字不唯一,则会列出所有以输入字符为开头的关键字。例如,首先输入 import machine 并按下 RETURN 键,导入 machine 模块。然后输入 m 并按 TAB 键,它会扩展为 machine。输入点 . 并再次按 TAB 键。应该会看到类似的内容:
>>> machine.
__name__ info unique_id reset
bootloader freq rng idle
sleep deepsleep disable_irq enable_irq
Pin
**注:**不同的开发板或固件显示的内容会有所不同
上面提到的,当有多个可能关键字时,会尽可能列出。例如,键入 machine.Pin.AF3,然后按 TAB 键,它将扩展为 machine.Pin.AF3_TIM。再次按 TAB 键将显示可能的扩展:
>>>machine.Pin.AF3_TIM
AF3_TIM10 AF3_TIM11 AF3_TIM8 AF3_TIM9
>>>machine.Pin.AF3_TIM
按 Ctrl-C 会中断正在运行的程序,这将引发键盘中断(KeyboardInterrupt),如果程序没有拦截键盘中断异常,则会返回 REPL。
>>>for i in range(1000000):
... print(i)
...
...
0
1
2
3
...
6466
6467
6468
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt:
>>>
如果要在终端窗口中粘贴一些代码,自动缩进功能会把事情搞得一团糟。例如,有以下 python 代码:
def foo():
print('This is a test to show paste mode')
print('Here is a second line')
foo()
如果尝试粘贴到普通模式的RPEL中时,会出现下面的情况:
>>>def foo():
... print('This is a test to show paste mode')
... print('Here is a second line')
... foo()
...
Traceback (most recent call last):
File "<stdin>", line 3
IndentationError: unexpected indent
如果按下 Ctrl-E,就会进入粘贴模式,该模式基本上关闭了自动缩进功能,并将提示符从 >>>
改为 ===
。 例如:
>>>
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== def foo():
=== print('This is a test to show paste mode')
=== print('Here is a second line')
=== foo()
===
This is a test to show paste mode
Here is a second line
>>>
粘贴模式允许粘贴空行。粘贴的文本会像文件一样被编译。按下 Ctrl-D 可退出粘贴模式并启动编译。
软重置将重置 python 解释器,但不会重置与 MicroPython 开发板连接的方式(USB-串口或 Wifi)。可以在 REPL 中按 Ctrl-D 执行软重置,也可以在 python 代码中执行软重置:
machine.soft_reset()
例如,如果重置 MicroPython 开发板并执行 dir() 命令,就会看到类似下面的内容:
>>>dir()
['__name__', 'pyb']
现在创建一些变量并重复执行 dir() 命令:
>>>i = 1
>>>j = 23
>>>x = 'abc'
>>>dir()
['j', 'x', '__name__', 'pyb', 'i']
>>>
**注意:**不同的板子显示结果会有不同
现在,如果输入 Ctrl-D,并重复 dir() 命令,就会发现变量已经不存在了:
MPY: sync filesystems
MPY: soft reboot
MicroPython v1.5-51-g6f70283-dirty on 2015-10-30; PYBv1.0 with STM32F405RG
Type "help()" for more information.
>>> dir()
['__name__', 'pyb']
>>>
_
(下划线)在使用REPL的时候,执行的计算结果会默认保存到一个下划线变量中,没错就是_
,所以,也可以用这个变量名把结果保存到另一个变量,举例:
>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>
REPL是MicroPython开发时经常用到的工具,结合mpremote
可以帮助我们更好的进行代码的测试和调试。有关mpremote
的用法可以参考另一篇文章MicroPython远程控制工具:mpremote。希望对进行MicroPython的伙伴们有所帮助,别忘了点赞收藏^_^
。