Python中如何調(diào)用系統(tǒng)命令和進程
在Python編程中,subprocess庫是一個功能強大的工具,它允許我們創(chuàng)建新進程、連接到其輸入/輸出/錯誤管道,并獲取其返回代碼。本文將詳細介紹subprocess庫的功能、應用場景,并通過代碼示例進行說明。此外,我們還將對比subprocess與os.system和os.popen的區(qū)別。
1. subprocess庫的功能
subprocess庫提供了多種功能,以滿足不同的需求。主要功能包括:
- 運行外部命令:可以執(zhí)行系統(tǒng)命令或調(diào)用其他可執(zhí)行文件。
- 交互式進程通信:啟動外部進程,并通過管道與其進行交互,發(fā)送輸入并獲取輸出。
- 管道和重定向:創(chuàng)建一個進程的輸出作為另一個進程的輸入,或重定向進程的輸出到文件。
- 進程管理:監(jiān)控進程狀態(tài),等待進程結束,或終止進程。
2. 應用場景及代碼示例
2.1 運行外部命令
subprocess.run()是一個高級接口,用于執(zhí)行外部命令并等待其完成。它返回一個CompletedProcess對象,包含執(zhí)行結果的相關信息。
代碼示例:
import subprocess # 執(zhí)行外部命令并捕獲輸出 result = subprocess.run(['ls', '-l'], capture_output=True, text=True) print("Return Code:", result.returncode) print("Standard Output:", result.stdout) print("Standard Error:", result.stderr)
解釋:
['ls', '-l']:要執(zhí)行的命令和參數(shù)。
capture_output=True:捕獲子進程的標準輸出和標準錯誤。
text=True:以文本模式處理輸入/輸出。
2.2 交互式進程通信
subprocess.Popen()提供了更靈活的方式來管理子進程,可以通過管道發(fā)送輸入數(shù)據(jù)給子進程,并獲取其輸出。
代碼示例:
import subprocess # 啟動一個子進程并與它交互 process = subprocess.Popen(['grep', 'pattern'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True) output, _ = process.communicate(input='some input data\n') print("Output:", output)
解釋:
['grep', 'pattern']:要執(zhí)行的命令和參數(shù)。
stdin=subprocess.PIPE:通過管道向子進程發(fā)送數(shù)據(jù)。
stdout=subprocess.PIPE:通過管道捕獲子進程的輸出。
process.communicate(input='some input data\n'):向子進程發(fā)送輸入數(shù)據(jù)并獲取輸出。
2.3 管道和重定向
subprocess庫可以輕松創(chuàng)建管道,將一個進程的輸出重定向到另一個進程的輸入。
代碼示例:
import subprocess # 第一個命令 p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) # 第二個命令,通過管道傳輸數(shù)據(jù) p2 = subprocess.Popen(['grep', '.py'], stdin=p1.stdout, stdout=subprocess.PIPE) output = p2.communicate()[0] print('Python文件列表:') print(output.decode())
解釋:
p1.stdout=subprocess.PIPE:將p1的輸出作為管道。
p2.stdin=p1.stdout:將p1的輸出作為p2的輸入。
p2.communicate():獲取p2的最終輸出。
2.4 進程管理
subprocess.Popen()還提供了多種方法來管理進程,如poll()、terminate()、kill()等。
代碼示例:
import subprocess # 啟動一個子進程 process = subprocess.Popen(['sleep', '10']) # 檢查進程是否仍在運行 print("Process is running:", process.poll() is None) # 終止進程 process.terminate() # 等待進程結束 process.wait() print("Process has terminated")
解釋:
process.poll():檢查進程是否仍在運行,返回None表示仍在運行,返回退出碼表示已結束。
process.terminate():請求終止進程。
process.wait():等待進程結束。
3. 與os.system和os.popen的對比
雖然os.system和os.popen也可以用于執(zhí)行外部命令并與進程進行交互,但它們與subprocess相比存在一些限制和不足。
3.1 os.system
os.system是Python中最簡單的執(zhí)行外部命令的方法,但它有幾個顯著的缺點:
- 無法捕獲輸出:os.system只能執(zhí)行命令,無法直接捕獲其輸出或錯誤。輸出會直接打印到控制臺。
- 返回碼有限:它返回一個8位的字節(jié),表示命令的退出狀態(tài),這可能導致狀態(tài)碼被截斷。
- 安全性問題:使用字符串拼接來構建命令可能會導致安全風險,如命令注入。
代碼示例:
import os # 執(zhí)行外部命令 exit_code = os.system('ls -l') print("Exit Code:", exit_code)
3.2 os.popen
os.popen允許我們打開一個與命令的管道,從中讀取輸出。與os.system相比,它可以捕獲輸出,但仍然有一些限制:
- 單向通信:它只能用于從命令讀取輸出,不能發(fā)送輸入。
- 資源管理:需要手動關閉文件對象,否則可能導致資源泄漏。
- 安全性問題:同樣存在命令注入的風險。
代碼示例:
import os # 打開一個與命令的管道并讀取輸出 process = os.popen('ls -l') output = process.read() process.close() print("Output:", output)
3.3 subprocess的優(yōu)勢
與os.system和os.popen相比,subprocess提供了以下優(yōu)勢:
更強大的功能:支持雙向通信、管道、重定向等高級功能。
更好的資源管理:可以自動管理文件描述符和進程,減少資源泄漏的風險。
更高的安全性:通過列表形式傳遞命令和參數(shù),避免了命令注入的風險。
更豐富的返回信息:subprocess.run()返回一個CompletedProcess對象,包含退出碼、輸出和錯誤等信息。
4. 總結
subprocess庫是Python中一個非常強大的工具,它提供了靈活而強大的進程管理功能。與os.system和os.popen相比,subprocess在功能、資源管理、安全性和返回信息方面都具有顯著優(yōu)勢。無論是簡單的命令執(zhí)行還是復雜的進程管理,subprocess庫都能滿足我們的需求。因此,在需要執(zhí)行外部命令或與進程進行交互時,推薦使用subprocess庫。
到此這篇關于Python中如何調(diào)用系統(tǒng)命令和進程的文章就介紹到這了,更多相關Python調(diào)用系統(tǒng)命令和進程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python pandas 對series和dataframe的重置索引reindex方法
今天小編就為大家分享一篇python pandas 對series和dataframe的重置索引reindex方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python數(shù)組遍歷的簡單實現(xiàn)方法小結
這篇文章主要介紹了Python數(shù)組遍歷的簡單實現(xiàn)方法,結合實例總結分析了Python針對數(shù)組的元素,索引常用遍歷技巧,需要的朋友可以參考下2016-04-04OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡
很多時候通過ps可以做很多效果,今天我們來介紹使用OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡,具有一定的參考價值,感興趣的可以了解一下2021-06-06