我對subprocess
在使用Popen()
時如何搜索可執行文件感到困惑。它的作品,如果給予子進程的絕對路徑,但我試圖使用相對路徑。我發現如果我設置了環境變量PYTHONPATH,那麼我可以從該路徑獲取導入的模塊,PYTHONPATH在sys.path
中,但它似乎對subprocess.Popen
的行爲沒有幫助。我也試着編輯sitecustomize.py
文件中添加PYTHONPATH到os.environ
,像這樣python subprocess Popen環境PATH?
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
並驗證啓動蟒蛇,無論是在交互,與IPython中,或通過在命令行運行腳本的時候,那是PYTHONPATH成功出現在os.environ
。但是,subrocess.Popen
仍然不在那裏搜索可執行文件。如果沒有指定env
kwarg,我認爲它應該繼承父母環境?接下來我試着明確地給出env
,首先製作os.getenv
的副本,其次是給env={'PATH': '/explicit/path/to/search/from'}
,但它仍然沒有找到可執行文件。現在我很難過。
希望一個例子將有助於更清楚地解釋我的問題:
/DIR/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], stdout=PIPE, stderr=PIPE).communicate()
如果我在/dir/subdir2
我和我運行python some_script.py
它的工作,但如果我在/dir
和我運行python subdir2/some_script.py
即使/dir/subdir2
是在os.environ['PATH']
,那麼子進程將拋出OSError: [Errno 2] No such file or directory
。
關於重讀這個問題,我想我看到了這個問題。在命令行shell中,切換到'/ dir'並查看如果輸入'../subdir1/some_executable'會出現什麼情況。 – ncoghlan 2011-04-14 06:24:08
好吧,我明白你在說什麼,我的誤解是假設相對路徑會像裸機程序一樣被搜索到。謝謝 – wim 2011-04-14 07:08:50