2012-03-19 45 views
2

我有一個shell腳本,我想從python程序中調用,但是根本無法使用以下代碼(Popen已導入) :使用python與Popen運行shell腳本在python命令行和實際程序中的行爲有所不同

bf_dir = '/home/wireless' 
bf_path = os.path.join(bf_dir, 'airdispatch.sh') 
sh = Popen("sudo " + bf_path, shell=True) 
print sh.communicate() 

理想的情況下,該腳本將生成輸出文件,但通過上面的代碼執行時,這些文件不會出現,並且「打印」的結果是[None, None]。我的猜測是,「Popen」根本不會被執行,或者可能是我在這裏犯了一個錯誤。所以我在Python命令行中運行上面的代碼,但事實證明,一切工作正常。這怎麼可能?請幫忙,謝謝。

回答

3

你沒有得到來自命令的輸出的原因是因爲你還沒有告訴子進程打開通信管道...

from subprocess import Popen, PIPE 

sh = Popen("sudo %s" % bf_path, shell=True, stdout=PIPE, stderr=PIPE) 

現在溝通會返回標準輸出的輸出和stderr。另外,如果它需要密碼輸入,它可能會導致你的問題。

+0

據我所見,sudo可能以這種方式工作 - 用'sudo apt-get update'進行測試,但它非常混亂,因爲你必須編寫純文本密碼。 – deinonychusaur 2012-03-19 22:02:17

1

使用shell = True並調用sudo聽起來有風險(look here),我寧願使用Popen而不使用Popen作爲文本字符串。

sh = Popen(['sudo', bf_path], shell=False, stdout=PIPE, stderr=PIPE) 
+0

這是錯誤的。當你使用shell標誌時,你可以傳遞一個字符串。您應該在downvotes之前刪除它。 – jdi 2012-03-19 21:49:14

+0

對不起,沒有看到shell標誌只是知道我遇到了這個問題,我自己回到Popen返回一個[無,無],它使用列表而不是空格分隔字符串解決自己。 – deinonychusaur 2012-03-19 21:54:01

+0

可能是這樣,但這個答案仍然是錯誤的,你應該刪除它。你在那裏複製並粘貼shell標誌。 – jdi 2012-03-19 21:55:06

相關問題