我正在将MicroPython集成到微控制器中,我想为我的产品添加一个调试逐步执行模式(通过连接到PC)。
值得庆幸的是,MicroPython包含 REPL 又名 Python shell 功能:我可以一次提供一行并执行。
我希望使用此功能在PC端单步执行并逐个发送Python脚本中的行。
任何 除了可能的时间之外,一次只运行一行Python脚本与python my_script.py
之间是否存在差异?
答案 0 :(得分:2)
在stdin上一次传递一行代码是完全不可接受的替代正确调试器。
我们假设您要调试以下内容:
def foo(): # 1
for i in range(10): # 2
if i == 5: # 3
raise Exception("Argh!") # 4
# 5
foo() # 6
...在正确的逐步调试器中,用户可以像这样使用它:
break 4
run
现在,你打算怎么做?如果在REPL中输入该函数,则该函数被定义为一个操作,并且它作为一个操作运行。它不会在第6行停止。它不会让你逐行进行。 for
循环也是如此:一次输入一行for
循环的文本并不允许您在抛出异常之前执行此操作。
如果你消除了这个函数,并且消除了循环(生成代码_something = iter(range(10)); i=_something.next()
,也许?),那么你需要模拟作用域的效果。这意味着你的语言与你据称的语言完全不同,并且调试"。
答案 1 :(得分:1)
我不知道MicroPython是否内置了compile()和exec()。 但是当嵌入式Python有它们时,当MCU有足够的RAM时,我会执行以下操作:
向embeded shell发送一行以开始使用多行字符串创建变量。
'_ code =“”“\'
发送我希望执行的代码(逐行或者)
使用“”
发送exec命令运行存储在MCU变量中的传输代码并获取输出。
如果您的RAM很小并且您无法一次传输整个代码,则应将其传输到将要执行的块中。像函数,循环等
如果您可以在PC上编译MicroPython的字节码,那么您应该能够将其传输并准备执行。这将使用更少的RAM。 但是,您是否可以将原始字节码注入shell并运行它取决于MicroPython与CPython的相似程度。
是的,有分歧。正如另一个答案中所解释的那样,逐行执行可能很棘手。所以代码块是你最好的选择。
答案 2 :(得分:0)
是 任何 差异......
是
例如,下面的代码适用于.py
文件,但在交互式解释器中是SyntaxError
:
x = 1
if x == 1:
pass
x = 2
还有许多其他差异,但仅此一点就足以让你远离这个想法。