模拟Python交互模式

时间:2016-10-15 18:11:33

标签: python read-eval-print-loop simulate

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

2 个答案:

答案 0 :(得分:2)

归结为阅读输入,然后

exec <code> in globals,locals

在无限循环中。

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

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

实际上,IPython已经有一个名为Jupyter Notebook的交互式网络控制台,所以你最好的选择就是重复使用它。

答案 1 :(得分:2)

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.