有没有人知道如何从在 python脚本中启动一个新的python虚拟机,然后与它进行交互以在完全单独的对象空间中执行代码?除了代码执行之外,我还希望能够访问此虚拟机上的对象和命名空间,查看异常信息等。
我正在寻找类似于python InteractiveInterpreter
(在code
模块中)的内容,但就我能够看到的情况而言,即使为解释器提供单独的命名空间(通过locals
参数),它仍然与启动它的脚本共享相同的对象空间。例如,如果我从sys
内部更改InteractiveInterpreter
模块的属性,则更改也会在脚本中生效。我想完全隔离这两个,就像我运行两个不同的python解释器实例在同一台机器上运行两个不同的脚本一样。
我知道我可以使用subprocess
在一个单独的进程中实际启动python,但我还没有找到任何与我想要的方式进行交互的好方法。我想我可能会用' -i'来调用它。并通过它的stdin流将代码推送到它,但我不认为我可以访问它的对象。
答案 0 :(得分:1)
如果您使用子进程启动一个新的Python实例,之后您可以通过套接字进行通信:为了避免执行低级别的东西,您可以查看扭曲的框架,还可以查看Pyro http://pythonhosted.org/Pyro4/。就个人而言,我发现Pyro更容易上手。
答案 1 :(得分:1)
它可能依赖于Python实现,如Pypy,Jython。在CPython中,如果你想要一个独立的解释器,你必须使用一个单独的进程,否则至少GIL是共享的。
multiprocessing
,concurrent.futures
模块允许您在单独的进程中运行任意Python代码,并轻松地与父进程通信。