2010-01-10 68 views
4

我試圖調試的第三方Python 2.5腳本讓我感到困惑。腳本的相關部分是:Python的subprocess.Popen()和源代碼

 proc = subprocess.Popen(
       "ls && source houdini_setup", 
       shell = True, 
       executable = "/bin/bash", 
       ) 

有一個守護進程監聽端口5001並運行上述腳本。當腳本運行時,它失敗,出現以下錯誤:

_cygwin.py 
houdini_setup 
... (more files) ... 
/bin/sh: line 0: source: houdini_setup: file not found 

有很多存在的文件houdini_setup,由LS所示,事實上,如果我改變「來源」爲「貓」在上面的腳本,該腳本按預期打印houdini_setup的內容。而且,在一個真正的bash shell中運行上述命令,也可以在不投訴的情況下生成文件。

有沒有人有任何想法這裏發生了什麼?

+0

我找到的空怪 – Mauli 2010-01-10 21:02:32

+0

發生我複製粘貼它調試;刪除行stdin = null;'不幸的是沒有任何區別。 – user168715 2010-01-10 21:04:15

回答

7

source使用$PATH找到您傳遞給它的內容,如果不指定目錄。嘗試source ./houdini_setup

+0

這樣做,謝謝! 在真實的bash shell中,即使當$ PATH不包含所述目錄時,源文件在當前目錄中也不需要./。任何想法爲什麼它需要在Popen()? – user168715 2010-01-10 21:09:10

+0

這可能與shell執行實際上是sh而不是bash,儘管該行傳遞給函數調用有關。 – LeafStorm 2010-01-10 21:14:00

+0

這是我的經驗,它*是*需要。總是。 – 2010-01-10 21:15:44

2

您可以使用strace來幫助診斷這樣的問題。在這種情況下與-ff標誌運行它遵循子會發現,你的代碼是在錯誤的地方尋找「houdini_setup」:

stat64("/usr/local/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 
stat64("/usr/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 
stat64("/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 

這可能導致您檢查文檔中的source內置。

0

也許你可以只使用bash本身做的工作,如果它是你的系統上:從我試圖代碼

os.popen("/bin/bash -l -c 'source $HOME/.yourfiletobesourced'") 
+1

您應該仍然使用'subprocess'模塊來做到這一點(使用'shell = True'關鍵字集)。 – 2012-12-06 23:01:00