2017-05-03 34 views
1

我需要在python腳本上運行一個大型的構建腳本(bash命令)。我將它作爲一個大字符串接收,並且每行都被\ n分隔。所以,我需要分別執行每一行。我試着用subprocess.Popen()來執行它們。但問題是:在每行之後,進程終止並且所有環境變量都丟失。在python中執行相同進程中的bash命令

問題不在於等命令完成執行另一個命令,我需要在同一個shell上執行所有命令。

到目前爲止,我發現的唯一解決方案是將所有這些命令保存爲sh文件(例如build.sh)並在python上執行它。

我不想使用這個approuch,因爲我想對每次執行有更多的控制權。

有什麼辦法可以在同一個進程上一個接一個地執行這些命令嗎?

任何其他解決方案也不錯。

+0

的可能的複製[蟒蛇等待shell命令來完成(http://stackoverflow.com/questions/16196712/python-to-wait-for-shell-command-to-complete) – vv01f

+0

你可以用'subprocess.Popen()'啓動一個shell,然後將命令提供給它的標準輸入。 – jasonharper

+0

@jasonharper你的意思是從Popen獲得輸出並直接添加到另一個Popen作爲標準輸入?但是環境變量呢?我怎麼能保留它們? – leandrocastelli

回答

2

你想要的絕對有點奇怪,但它可能使用管道。

from subprocess import PIPE, Popen 

p = Popen(['bash'], stdin=PIPE, stdout=PIPE) 
p.stdin.write('echo hello world\n') 
print(p.stdout.readline()) 
# Check a return code 
p.stdin.write('echo $?\n') 
if p.stdout.readline().strip() ⩵ '0': 
    print("Command succeeded") 
p.stdin.write('echo bye world\n') 
# Close input and wait for bash to exit 
stdout, stderr = p.communicate() 
print(stdout) 
+1

您可能需要'flush'stdout來確保這個工作正常並且強制'bash'無緩衝地運行,否則你會死鎖;即使那樣,它也會變得脆弱。您可能需要使用'select'模塊和/或線程來確保沒有死鎖,或者使用第三方'pexpect'模塊來實現更多可定製的控制。 – ShadowRanger

0

當調用一個shell時,os會啓動一個新進程,除非你在python中一直有一個shell解釋器。

在同一個過程中完成它的唯一可能性是直接模擬python的所有步驟。

更好的辦法是接受限制,自己調用外部進程並等待腳本終止控制。例如是這裏:python to wait for shell command to complete