日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python执行shell命令查看输出_python 运行 shell 命令并捕获输出_python_酷徒编程知识库...

發布時間:2025/3/21 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_酷徒编程知识库...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。