2012-05-29 40 views
2

使用Python 3.2,和下面的代碼片段:蟒子溝通掛起調用shell腳本

p = subprocess.Popen(['../start_server.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out,err = p.communicate() 

if out != None : 
    out = out.decode('utf-8') 
if err != None : 
    err = err.decode('utf-8') 

print('out ',out) 
print('err ',err) 

一些shell腳本,它工作得很好,我得到我的輸出。在別人身上它只是掛起。但在任何情況下,shell腳本都從命令行運行,沒有任何錯誤。我能看到的唯一通用性(通常)是掛起的零輸出。當東西失敗了,我檢查正在運行的進程,我看到我的shell腳本沒有列出,Python腳本仍在運行

請告訴我一個可靠的方法來調用一個shell腳本和總是返回控制到我的Python程序?


編輯:

使用管道POPEN而這樣是不是必需的,唯一的要求是shell腳本退出時控制返回到我的Python腳本。如果shell腳本永遠不會返回到命令提示符,那麼我的python腳本也將永遠不會返回。

因此,假設我所調用的shell腳本總是返回到命令提示符,那麼我怎樣才能控制回到我的python程序?
如果那裏有一個更好的辦法是什麼香港專業教育學院上面列出 - 請賜教

一個額外位香港專業教育學院發現是shell腳本「掛起」似乎與以「nohup的」葉打電話,他們返回到命令結束沒有問題的提示。

+0

它可能是你的腳本正在做的事情(產卵另一個過程)? – jdigital

+0

我的代碼片段調用各種shell腳本。他們都可以啓動一個新流程,或停止一個現有流程。有些工作,有些則沒有。但是在任何情況下,shell腳本都可以在命令提示符下正常運行,不會產生任何錯誤並執行它們應有的操作。我試圖自動調用我們現有的生產腳本,所以對它們進行更改是不可能的。 – Jon

+0

我並不是建議你改變任何事情,我給你一個提示,要尋找的東西,這可能會幫助你確定問題的原因。 – jdigital

回答

0

什麼是一個可靠的方式來調用一個shell腳本,總是返回控制 到我的python程序?

如果您使用管道,這將取決於您的腳本;更普遍的答案實質上是halting problem,即使是強大的StackOverflow也無法幫助你。

我鼓勵你深入挖掘並嘗試創建一個可重現的案例,以便我們可以幫助你解決你所看到的特定問題。

編輯

如果你不需要管,那麼就省略了輸出和錯誤參數(或將它們設置爲PIPE其他東西)。請參閱python subprocess management

+1

好吧,如果shell腳本永遠不會返回到命令提示符,我會希望我的python腳本也這樣做。但事實並非如此。所有的shell腳本完成後都會返回到命令提示符。 – Jon

+1

如果stdin和stdout連接到管道而不是連接到控制檯(tty),程序可能會改變它們的行爲;最值得注意的是,緩衝行爲發生了變化,但也可能是其他不同的事情。所以你描述的情況並不令人驚訝。 – jdigital