有没有更好的方法来控制子进程的 PYTHONPATH?

Posted

技术标签:

【中文标题】有没有更好的方法来控制子进程的 PYTHONPATH?【英文标题】:Is there a better way to control the PYTHONPATH of a subprocess? 【发布时间】:2012-09-17 12:54:39 【问题描述】:

我有一组脚本必须即时修改 os.sys.path。然后脚本启动一个子进程。理想情况下,子进程将具有与调用者相同的 os.sys.path。我想避免将它作为参数传递,因为这需要修改子进程脚本。

我的代码可以满足我的所有需求。我想知道是否有更好的方法来做到这一点,以及这种方法是否存在任何缺陷。

主要流程

import os
import sys
import subprocess

#append a dir thats not on the sys path
sys.path.append('C:/pytest2/')

#convert the sys.path into env variable format
pypath = ''
for d in sys.path:
    pypath = pypath + d + ';'

#create a temp copy of the env variables
myenv = os.environ.copy()

#set PYTHONPATH to match this scripts sys.path
myenv['PYTHONPATH'] = pypath

#setup a python command to echo the sys.path
command = 'python C:/pytest/test_subprocess.py'

#launch the subprocess with the custom env
p = subprocess.Popen(command, env=myenv)

C:/pytest/test_subprocess.py

import sys
print 'sys path'
print sys.path

运行主进程会产生这个控制台输出

如您所见,C:/pytest2/ 在 test_subprocess.py 的 os.sys.path 上

编辑将 os.sys 更改为 sys

【问题讨论】:

你可以在你的系统pythonpath环境变量中设置它吗? 您是指在运行中还是永久在机器上? 如果你知道运行时的路径,并且你没有同时运行多个 python 模块,那么在机器上永久设置它可能会简单得多(如果你不这样做,然后再改回来不希望它保持这种状态) 您应该指的是sys.path,而不是os.sys.path(导入系统)。那是规范模块。通过另一个模块导入间接访问不是一个好的设计实践。 【参考方案1】:

PYTHONPATH 环境变量只是附加到sys.path。 Python 本身(和site 模块)从各种来源初始化模块搜索路径。您只需要通过 PYTHONPATH 环境变量添加您的一个目录。更好的办法是将它安装在已经搜索过的通常的站点包目录中。这样你就不必在环境中做任何特别的事情了。

【讨论】:

我不明白这如何帮助我在运行中将目录添加到路径中。 我是说几乎没有必要这样做。换句话说,如果你认为你必须这样做,那么你就做错了。 setuptools 包还提供了帮助开发过程的工具,例如操作 sys.path 以便您从工作区运行。在你的模块中根本不应该有任何代码必须触及 sys.path。最多可以操作package.__path__ 我的代码必须在程序上调用其他目录中的其他脚本。当主脚本启动时(它是一个守护进程),这些脚本(以及它们所在的目录)甚至可能不存在。那我做错了吗?或者这是那些“几乎从来没有”的时代之一? 如果您想在当前解释器中运行新文件,您可以使用execfile 函数。或者只是像你一样运行文件。当 Python 初始化时,它会自行设置大部分搜索路径。无需在 PYTHONPATH 中复制它。 我认为我们正在互相交谈。主进程如何确保子进程将以正确的搜索路径启动? (除了给它搜索路径,这是我所做的)

以上是关于有没有更好的方法来控制子进程的 PYTHONPATH?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来访问我的 XML 文档中的子节点?

(C++,Windows)生成没有控制台窗口的子进程(使用 CreateProcess)

当没有附加控制台时,python 子进程似乎无法正常工作

C# - 向子进程发送输入 - 控制台应用程序

有没有更好的方法(除了 COM)来远程控制 Excel?

Linux进程控制--进程的等待与替换