从api模拟多行shell行为

时间:2016-01-05 18:45:59

标签: python c

在python shell中,如果我输入:

def a():

按回车键,不会评估该命令。然后,一旦我逐行输入,它将评估整个块。

python shell如何知道它何时不应该处理给定的输入(行)? 它是python的一个特性(即python可以判断一行代码是不完整的),还是shell本身的一个特性(基于正则表达式,即当行以冒号结束时,等待更多输入)?

如何使用python C api复制此行为?如果我使用runSimpleString方法,它将尝试执行任何给定的文本,因此我无法复制这个"等待更多输入"正常python shell执行的功能

1 个答案:

答案 0 :(得分:1)

虽然我没有查看Python解释器的源代码,但我可以告诉你它是如何实现的。

这不是终端的功能(Windows命令提示符/ bash / other),因为您已经将Python解释器作为程序运行,并且终端模拟器在实现方面的变化太大而无法依赖它们。进一步证明这不是终端的功能是您在运行>>>时看到的Python提示,而不是通常的命令提示符$>,等

正则表达式也不足以判断代码是否已到达,因为语言(Python)对于RegEx而言过于复杂。必须使用Abstract Syntax Tree (AST)来确定(无论如何)代码是否完整。

因此,Python解释器必须是一个独立的程序,它使用AST来解析给定的输入,然后在确定代码足够完整以便尝试时将程序评估为Python执行。