以编程方式启动并与Python虚拟机交互
有没有人知道怎么从一个 Python 脚本里面启动一个新的 Python 虚拟机,然后和它互动,执行代码,并且在一个完全独立的对象空间里运行?除了执行代码,我还想能访问这个虚拟机里的对象和命名空间,查看异常信息等等。
我想要的东西有点像 Python 的 InteractiveInterpreter
(在 code
模块里),但是我发现即使你为解释器提供了一个单独的 命名空间(通过 locals
参数),它还是和启动它的脚本共享同一个 对象空间。比如说,如果我在 InteractiveInterpreter
里面修改了 sys
模块的某个属性,这个修改在脚本里也会生效。我想要完全隔离这两者,就像在同一台机器上运行两个不同的 Python 解释器来执行两个不同的脚本一样。
我知道我可以用 subprocess
来启动一个新的 Python 进程,但我还没找到什么好的方法来像我想的那样和它互动。我想我可以用 '-i' 启动它,并通过它的标准输入流发送代码,但我觉得我根本无法访问它的对象。
2 个回答
这可能跟你用的Python版本有关,比如Pypy或Jython。在CPython(最常用的Python版本)中,如果你想要一个独立的解释器,就必须使用一个单独的进程,否则至少会共享全局解释器锁(GIL)。
multiprocessing
和concurrent.futures
这两个模块可以让你在不同的进程中运行Python代码,并且可以很方便地和主进程进行沟通。
如果你用子进程启动一个新的Python实例,之后你可以通过套接字进行通信。为了避免处理那些底层的复杂操作,你可以看看twisted框架,也可以了解一下Pyro http://pythonhosted.org/Pyro4/。我个人觉得Pyro更容易上手。