在shell中以原子方式逐行运行Python脚本

时间:2017-09-29 19:22:22

标签: python micropython

我正在将MicroPython集成到微控制器中,我想为我的产品添加一个调试逐步执行模式(通过连接到PC)。

值得庆幸的是,MicroPython包含 REPL 又名 Python shell 功能:我可以一次提供一行并执行。

我希望使用此功能在PC端单步执行并逐个发送Python脚本中的行。

任何 除了可能的时间之外,一次只运行一行Python脚本与python my_script.py之间是否存在差异?

3 个答案:

答案 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时,我会执行以下操作:

  1. 向embeded shell发送一行以开始使用多行字符串创建变量。

    '_ code =“”“\'

  2. 发送我希望执行的代码(逐行或者)

  3. 使用“”

  4. 关闭多行字符串
  5. 发送exec命令运行存储在MCU变量中的传输代码并获取输出。

  6. 如果您的RAM很小并且您无法一次传输整个代码,则应将其传输到将要执行的块中。像函数,循环等

    如果您可以在PC上编译MicroPython的字节码,那么您应该能够将其传输并准备执行。这将使用更少的RAM。 但是,您是否可以将原始字节码注入shell并运行它取决于MicroPython与CPython的相似程度。

    是的,有分歧。正如另一个答案中所解释的那样,逐行执行可能很棘手。所以代码块是你最好的选择。

答案 2 :(得分:0)

  

任何 差异......

例如,下面的代码适用于.py文件,但在交互式解释器中是SyntaxError

x = 1
if x == 1:
    pass
x = 2

还有许多其他差异,但仅此一点就足以让你远离这个想法。