python执行shell命令查看输出_python 运行 shell 命令并捕获输出_python_酷徒编程知识库...
這個問題的答案取決于你使用的python 版本。 最簡單的方法是使用 subprocess.check_output 函數:>>> subprocess.check_output(['ls', '-l'])
b'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'
check_output 運行一個只接受參數的程序,因為 input.1 它返回的結果與打印到 stdout 完全相同 。 如果需要將輸入寫入 stdin,請跳到 run 或 Popen 節。 如果要執行復雜的shell 命令,請參見這里答案末尾的shell=True 上的注釋。
check_output 函數幾乎適用于幾乎所有的 python版本, 比如仍然廣泛使用( 2.7 ).2 , 但是對于更新版本它不再是推薦的方法 。
python ( 3.5或更高)的現代版本: run
如果使用 python 3.5或更高版本,并且不需要向后兼容,則建議使用新 run 函數 。 它為 subprocess 模塊提供了一個非常通用, 高級的API 。 要捕獲程序的輸出,請將 subprocess.PIPE 標志傳遞給 stdout 關鍵字參數。 然后訪問返回的CompletedProcess 對象的stdout 屬性:>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'
返回值是 bytes 對象,因此如果需要適當的字符串,則需要對它的進行 decode 處理。 假定被調用的進程返回一個UTF-8-encoded字符串:>>> result.stdout.decode('utf-8')
'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'
這可以全部壓縮成一行:>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'
如果要將輸入傳遞給進程的stdin,請將 bytes 對象傳遞給 input 關鍵字參數:>>> cmd = ['awk', 'length($0)> 5']
>>> input = 'foonfoofoon'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)
>>> result.stdout.decode('utf-8')
'foofoon'
通過傳遞 stderr=subprocess.PIPE ( 捕獲到 result.stderr ) 或 stderr=subprocess.STDOUT ( 與常規輸出一起捕獲到 result.stdout ) 可以捕獲錯誤。 如果不考慮安全性,你還可以通過傳遞 shell=True 來運行更復雜的shell 命令,如下面的注釋所述。
這只是增加了一點復雜性,與以前實現的方式相比。 但我認為這是值得 : 現在你幾乎可以做任何你需要做的run功能。
python ( 2.7 -3.4 )的舊版本: check_output
如果你使用的是舊版本的python,或者需要適度的向后兼容性,那么你可以使用 check_output 函數,如上面所述。 自 python 2.7以來,它已經可用。subprocess.check_output(*popenargs, **kwargs)
它采用與 Popen ( 請參見下面) 相同的參數,并返回一個包含程序輸出的字符串。 這個答案的開頭有一個更詳細的用法示例。 在 python 3.5和更高版本中 check_output 相當于使用 check=True 和 stdout=PIPE 執行 run 并僅返回 stdout 屬性 。
你可以傳遞 stderr=subprocess.STDOUT 以確保錯誤消息包含在返回的輸出--中但在某些版本的 python 中將 stderr=subprocess.PIPE 傳遞給 check_output 會導致死鎖 如果不考慮安全性,你還可以通過傳遞 shell=True 來運行更復雜的shell 命令,如下面的注釋所述。
如果你需要從 stderr 進行管道傳輸或將輸入傳遞給進程則 check_output 將無法完成任務 。 請參見下面的Popen 示例。
復雜的應用程序 & python ( 2.6和更高版本)的舊版本: Popen
如果你需要深度向后兼容性,或者如果你需要比 check_output 提供的更復雜的功能則必須直接使用 Popen 對象,這些對象封裝了子進程的低級 API
Popen構造函數接受不帶參數的單個命令,或者包含命令作為其第一個項目的列表,后跟任意數量的參數,每個參數作為列表中的單獨項目。 shlex.split 可以幫助將字符串解析為適當格式化的列表。 Popen 對象還接受主機的不同參數用于進程管理和低級別配置 。
要發送輸入和捕獲輸出,communicate 幾乎是首選方法。 如中所示:output = subprocess.Popen(["mycmd","myarg"],
stdout=subprocess.PIPE).communicate()[0]
或者>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo
如果設置 stdin=PIPEcommunicate 還允許你通過 stdin 將數據傳遞給進程:>>> cmd = ['awk', 'length($0)> 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
... stderr=subprocess.PIPE,
... stdin=subprocess.PIPE)
>>> out, err = p.communicate('foonfoofoon')
>>> print out
foofoo
在某些情況下,你可能需要復雜的實時輸出捕捉。 Vartec 回答建議的方法,但是如果不仔細使用 communicate 以外的方法容易出現死鎖 。
上述所有功能一樣,當安全不是一個問題時,你可以通過傳遞 shell=True 來運行更復雜的shell 命令。
備注
1.運行 shell 命令:shell=True 參數
通常,每個對 run 。check_output 或 Popen 構造函數的調用都執行單個程序。 那就意味著沒有漂亮的bash樣式管道。 如果要運行復雜的shell 命令,可以通過 shell=True,這三個函數都支持。
但是,這樣做會引發安全問題 如果你做的不僅僅是輕腳本,你可能最好分別調用每個進程,并將每個進程的輸出作為輸入傳遞給下一個進程,通過run(cmd, [stdout=etc...], input=other_output)
或者Popen(cmd, [stdout=etc...]).communicate(other_output)
直接連接管道的誘惑很強;抵制它。 否則你可能會看到死鎖或者不得不像這樣的這樣的 hacky
2.Unicode注意事項
check_output 在 python 2中返回字符串,但在 python 3中返回 bytes 對象。 如果你還沒有請花點時間了解 unicode 。
總結
以上是生活随笔為你收集整理的python执行shell命令查看输出_python 运行 shell 命令并捕获输出_python_酷徒编程知识库...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程小白学python知乎周刊_在知乎上
- 下一篇: 查看防火墙状态_干货 | 华为防火墙配置