2016-06-10 48 views
0

我正在編寫一個腳本,我希望能夠運行命令行命令,可能使用os.system(「stuff」)。但是如果我的命令不能自行結束呢?就像,通常在我的終端,我不得不ctl + C來結束它。有沒有辦法讓我可以運行它,停止它,並抓住輸出?在腳本中停止命令行命令

我敢肯定,必須有,但我不知道,我不知道如果我知道正確的術語找到它(我所有的Python是自學成才,從實驗)

謝謝!

+2

你想[子流程模塊](https://docs.python.org/3.4/library/subprocess.html),可能與[一個StringIO緩衝區](https://docs.python.org/2/library/ stringio.html)用作內存中的輸出管道。 *可能*線程,但希望你能避免它們。這有點棘手,但希望這給你一個想找什麼的想法。 –

回答

3

os.system()不會返回由它產生的subshel​​l的控制權,而是隻在子shell完成執行命令時返回退出代碼。這可以通過以下方式驗證:

x = os.system("echo 'shankar'") 
print(x) 

您需要的是subprocess庫。 您可以使用subprocess.Popen()函數來啓動子流程。該函數將子進程的控制權作爲可以被操縱來控制子進程的對象返回。

子流程模塊提供了更強大的功能,用於產生新進程並檢索其結果。

運行:

import subprocess 
proc = subprocess.Popen(['foo', 'bar', 'bar'], stdout=subprocess.PIPE, shell=True) 

這裏proc是返回的對象,其提供在所述催生子進程控制。您可以檢索有關該過程的信息或使用此對象對其進行處理。

proc.pid # returns the id of process 

停止它:

proc.terminate() # terminate the process. 

Popen.terminate()是發送ctrl+c(SIGTERM)到子進程的等效。

您可以使用Popen.communicate()函數獲得輸出。

獲取輸出:

out, err = proc.communicate() 

注:Popen.communicate()回報輸出只有當子已成功退出或者被終止或被殺害。