我有两个版本的Python(实际上是两个conda环境)
/path/to/bin-1/python
/path/to/bin-2/python
我想从一个版本的 python 启动一个在另一个版本中运行的函数,使用类似multiprocessing.Process
目的。事实证明,这是可以使用set_executable
method:
ctx = multiprocess.get_context('spawn')
ctx.set_executable('/path/to/bin-2/python')
事实上,我们可以看到它实际上是使用该可执行文件启动的:
def f(q):
import sys
q.put(sys.executable)
if __name__ == '__main__':
import multiprocessing
ctx = multiprocessing.get_context('spawn')
ctx.set_executable('/path/to/bin-2/python')
q = ctx.Queue()
proc = ctx.Process(target=f, args=(q,))
proc.start()
print(q.get())
$ python foo.py
/path/to/bin-2/python
然而路径是错误的
但是当我做同样的事情时sys.path
而不是sys.executable
我发现托管 python 进程的 sys.path 被打印出来,而不是我从运行中找到的 sys.path/path/to/bin-2/python -c "import sys; print(sys.path)"
直接地。
如果我使用 fork,我已经习惯了这种事情。我本以为'spawn'
就像我从 shell 进入 python 解释器一样。
Question
是否可以使用多处理库来运行函数并使用另一个 Python 可执行文件中的队列以及从 shell 启动它时所具有的环境?
更广泛地说,sys.path 是如何填充的,以这种方式使用多处理和直接启动解释器有什么不同?