模拟Python交互模式
问题描述:
我正在为VK编写一个私人在线Python解释器,它将密切模拟IDLE控制台。只有我和白名单中的一些人才能使用此功能,没有不安全的代码会损害我的服务器。但我有一个小问题。例如,我发送字符串代码为def foo():
,我不想获得SyntaxError
,但继续逐行定义函数,而不使用\n
编写长字符串。在这种情况下,exec()
和eval()
不适合我。我应该用什么来获得所需的效果?对不起,如果重复,仍然不会从类似的问题得到它。模拟Python交互模式
答
Python标准库提供了code
和codeop
模块来帮助您解决这个问题。该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控制台,所以你最好的选择应该是重用它。