2012-09-25 68 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

相關問題