2012-09-25 66 views
4

我有一组脚本需要随时修改os.sys.path。脚本然后启动一个子进程。理想情况下,子进程与调用者具有相同的os.sys.path。我想避免将它作为参数传递,因为这需要修改子流程脚本。有没有更好的方法来控制子进程的PYTHONPATH?

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

主要工艺

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 

在这个控制台输出

enter image description here

运行的主要过程的结果,你可以请参阅C:/ pytest2 /位于test.subprocess的os.sys.path中。 PY

编辑改变os.sys到SYS

+0

你可以在你的系统pythonpath环境变量中设置它吗? – BostonJohn

+0

你的意思是在机器上或永久在机器上? – Miebster

+0

如果你知道运行时的路径,并且你并没有同时运行多个python模块,那么只需在机器上永久地设置它就可以简单得多(如果你不想让它停留在那个地方,方式) – BostonJohn

回答

-3

PYTHONPATH环境变量只是追加到sys.path。 Python本身(和site模块)从各种来源初始化模块搜索路径。您只需要通过PYTHONPATH环境变量添加您的一个目录。更好的办法是将它安装在通常的site-packages目录中,并已经被搜索到。那么你不必在环境中做任何特殊的事情。

+0

我不明白这是如何帮助我添加目录到实时路径。 – Miebster

+0

我在说这几乎没有必要这样做。换句话说,如果你认为你必须这样做,那么你做错了。 setuptools软件包还提供了一些工具来帮助开发过程,比如操作sys.path以供您从工作空间运行。在你的模块中,实际上应该没有必须触摸sys.path的代码。最多可以操作'package .__ path__'。 – Keith

+0

我的代码必须在其他目录中以程序方式调用其他脚本。当主脚本启动时(这是一个守护进程),这些脚本(以及它们所在的目录)甚至可能不存在。那么我做错了吗?或者这是“几乎从未”过的时代之一? – Miebster

相关问题