2014-01-28 184 views
8

Popen的docs提到你不能指定相對於'change working directory'kwarg的可執行路徑。subprocess.Popen使用相對路徑

如果cwd不是沒有,在執行之前,孩子的當前目錄將變更爲 cwd請注意,在搜索可執行文件時,此目錄不是 ,因此您無法指定 程序相對於cwd的路徑。

但是Python是我的系統上的行爲似乎直接反駁這種說法:

[email protected]:/tmp$ mkdir a 
[email protected]:/tmp$ cp /bin/ls /tmp/a/my_ls 
[email protected]:/tmp$ mkdir b 
[email protected]:/tmp$ touch /tmp/b/potato 
[email protected]:/tmp$ cd /home/wim 
[email protected]:~$ python 
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
[GCC 4.8.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from subprocess import check_output 
>>> check_output(['../a/my_ls'], cwd='/tmp/b') 
'potato\n' 
>>> check_output(['../a/my_ls']) 
OSError: [Errno 2] No such file or directory 

是使用相對路徑來cwd東西是平臺相關的,不應被依賴?或者這是一個文檔錯誤?

(這個問題從評論通過glglgl here派生)

回答

7

是的,這是依賴於平臺。

在POSIX系統上,該進程是分叉的,並且在子進程中執行os.chdir(cwd)之前執行可執行文件。

但是在Windows上,使用CreateProcess() API call,並且cwd作爲lpCurrentDirectory參數傳入。沒有目錄更改發生,並且CreateProcess()調用而不是查找要執行的lpApplicationName時參考該參數。

爲了讓您的應用程序跨平臺,在查找可執行文件時,不應該依賴當前的工作目錄進行更改。