gpt4 book ai didi

python - 在具有自己路径的不同 python 可执行文件下生成 multiprocessing.Process

转载 作者:行者123 更新时间:2023-12-02 11:17:15 26 4
gpt4 key购买 nike

我有两个版本的 Python(这些实际上是两个 conda 环境)

/path/to/bin-1/python
/path/to/bin-2/python

我想从 python 的一个版本启动一个函数,该函数使用类似 multiprocessing.Process 的东西在另一个版本中运行。目的。事实证明,使用 set_executable 是可行的方法:
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 解释器一样。



是否可以使用多处理库来运行函数并使用来自另一个 Python 可执行文件的队列以及我从 shell 启动它的环境?

更广泛地说,sys.path 是如何填充的,以这种方式使用多处理和直接启动解释器有什么不同?

最佳答案

我遇到了同样的问题。我的系统范围的 Python 可执行文件位于 /path/to/bin-1/python ,我使用 virtualenv 创建了一个虚拟环境包含另一个 Python 可执行文件 /path/to/bin-2/python .为 /path/to/bin-2/python 所需的生成进程设置正确的路径/环境,我最终复制了来自 activate_this.py 的代码在 virtualenv文件夹到 f(q) .

def f(q):
import sys, os

def active_virtualenv(exec_path):
"""
copy virtualenv's activate_this.py
exec_path: the python.exe path from sys.executable
"""
# set env. var. PATH
old_os_path = os.environ.get('PATH', '')
os.environ['PATH'] = os.path.dirname(os.path.abspath(exec_path)) + os.pathsep + old_os_path
base = os.path.dirname(os.path.dirname(os.path.abspath(exec_path)))
# site-pachages path
if sys.platform == 'win32':
site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
# modify sys.path
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
return None

active_virtualenv(sys.executable)
q.put(sys.executable)
# check some unique package in this env.
import special_package
print "package version: {}".format(special_package.__version__)


if __name__ == '__main__':
import multiprocessing
multiprocessing.set_executable('/path/to/bin-2/python')
q = multiprocessing.Queue()
proc = multiprocessing.Process(target=f, args=(q,))
proc.start()
proc.join()
print(q.get())

标准输出:
$ python foo.py
/path/to/bin-2/python
package version: unique_version_only_in_virtualenv

我不太确定的一件事是 sysosimport之前编辑过 active_virtualenv() ,这意味着它们来自系统范围的 Python 环境。但是我在 f(q) 中需要的其他软件包来自虚拟环境。也许值得重新- import他们在切换环境后。

关于python - 在具有自己路径的不同 python 可执行文件下生成 multiprocessing.Process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39372708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com