我試圖使用python自動化一個進程。如果我只是在終端工作流程看起來像:使用Python打開一個shell環境,運行一個命令並退出環境
user:> . /path/to/env1.sh
user:> python something.py
user:> exit
user:> . /path/to/env2.sh
user:> python something2.py
user:> exit
等等一些更多的步驟。每個env.sh
都會生成一個新腳本,其中包含大量環境變量以及當前目錄中未設置的內容。我很確定我需要使用子進程,但我不確定如何去做。理想情況下,工作流程將執行:打開新shell - >運行一些命令 - >退出shell - >根據需要重複。
編輯:這似乎需要一些澄清。我知道如何使用subprocess.Popen()
和subprocess.call()
從shell腳本中調用Python腳本的東西。這不是我需要的。當我們調用env.sh
時,它設置了大量的環境變量和其他一些相關的東西,然後將你放入shell來運行命令。重要的是要注意,在運行所需命令之後,env.sh
不會終止,直到一個類型爲exit
。使用subprocess.call("./env.sh", shell = True)
打開外殼並停在那裏。這就像輸入命令./env.sh
,只是當發出exit
命令時,其餘的python腳本。所以:
subprocess.call(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
沒有做什麼,我需要它做的事,也沒有:
p = subprocess.Popen(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
p.kill()
我的解決辦法使用Popen.communcate()我確實有一些麻煩讓我的輸入通過,但我在這裏找到答案: http://stackoverflow.com/questions/12965 023/python-subprocess-popen-communicate-equivalent-to-popen-stdout-read 需要從子進程中導入PIPE才能將字符串傳遞給子進程。我並不完全確定要選擇哪個答案,因爲他們中的任何一個都不是完全正確的,並且許多建議使用的模塊將被棄用。 – user3377586
如果你認爲你知道答案,然後張貼*作爲答案*而不是評論,並接受它。 – jfs