模拟Python交互模式

问题描述:

我正在为VK编写一个私人在线Python解释器,它将密切模拟IDLE控制台。只有我和白名单中的一些人才能使用此功能,没有不安全的代码会损害我的服务器。但我有一个小问题。例如,我发送字符串代码为def foo():,我不想获得SyntaxError,但继续逐行定义函数,而不使用\n编写长字符串。在这种情况下,exec()eval()不适合我。我应该用什么来获得所需的效果?对不起,如果重复,仍然不会从类似的问题得到它。模拟Python交互模式

Python标准库提供了codecodeop模块来帮助您解决这个问题。该code模块只是直线上升的模拟标准的交互式解释:

import code 
code.interact() 

它还提供了更精细的控制和它是如何工作的定制一些设施。

如果你想从更基本的组件构建的事情了,在codeop模块提供了一个命令编译器记住__future__声明并确认不完整的命令:

import codeop 
compiler = codeop.CommandCompiler() 

try: 
    codeobject = compiler(some_source_string) 
    # codeobject is an exec-utable code object if some_source_string was a 
    # complete command, or None if the command is incomplete. 
except (SyntaxError, OverflowError, ValueError): 
    # If some_source_string is invalid, we end up here. 
    # OverflowError and ValueError can occur in some cases involving invalid literals. 

它归结为读取输入,然后

exec <code> in globals,locals 

在无限循环。

参见例如IPython.frontend.terminal.console.interactiveshell.TerminalInteractiveSh ell.mainloop()

继续检测在inputsplitter.push_accepts_more()中通过尝试ast.parse()完成。

事实上,IPython已经有一个名为Jupyter Notebook的交互式Web控制台,所以你最好的选择应该是重用它。