我正在編寫一個腳本,我希望能夠運行命令行命令,可能使用os.system(「stuff」)。但是如果我的命令不能自行結束呢?就像,通常在我的終端,我不得不ctl + C來結束它。有沒有辦法讓我可以運行它,停止它,並抓住輸出?在腳本中停止命令行命令
我敢肯定,必須有,但我不知道,我不知道如果我知道正確的術語找到它(我所有的Python是自學成才,從實驗)
謝謝!
我正在編寫一個腳本,我希望能夠運行命令行命令,可能使用os.system(「stuff」)。但是如果我的命令不能自行結束呢?就像,通常在我的終端,我不得不ctl + C來結束它。有沒有辦法讓我可以運行它,停止它,並抓住輸出?在腳本中停止命令行命令
我敢肯定,必須有,但我不知道,我不知道如果我知道正確的術語找到它(我所有的Python是自學成才,從實驗)
謝謝!
os.system()不會返回由它產生的subshell的控制權,而是隻在子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()
回報輸出只有當子已成功退出或者被終止或被殺害。
您可以設置一段時間或循環和if條件,殺與過程: os.kill(),獲取進程PID使用os.getpid()
你想[子流程模塊](https://docs.python.org/3.4/library/subprocess.html),可能與[一個StringIO緩衝區](https://docs.python.org/2/library/ stringio.html)用作內存中的輸出管道。 *可能*線程,但希望你能避免它們。這有點棘手,但希望這給你一個想找什麼的想法。 –