一文搞懂Python中subprocess模塊的使用
簡(jiǎn)介
subprocess是子流程,即進(jìn)程的意思,該模塊可以啟動(dòng)一個(gè)新進(jìn)程,并連接到它們的輸入/輸出/錯(cuò)誤管道,從而獲取返回值。
常用方法和接口
1、subprocess.run()
2、subprocess.call()
3、subprocess.check_call()
4、subprocess.getstatusoutput()
5、subprocess.getoutput()
6、subprocess.check_output()
7、subprocess.Popen()
subprocess.run()解析
常用參數(shù):
- args:表示要執(zhí)行的命令。必須是一個(gè)字符串,字符串參數(shù)列表。
- stdin、stdout 和 stderr:子進(jìn)程的標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一個(gè)已經(jīng)存在的文件描述符、已經(jīng)打開(kāi)的文件對(duì)象或者 None。subprocess.PIPE 表示為子進(jìn)程創(chuàng)建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默認(rèn)使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起輸出。
- timeout:設(shè)置命令超時(shí)時(shí)間。如果命令執(zhí)行時(shí)間超時(shí),子進(jìn)程將被殺死,并彈出 TimeoutExpired 異常。
- check:如果該參數(shù)設(shè)置為 True,并且進(jìn)程退出狀態(tài)碼不是 0,則彈 出 CalledProcessError 異常。
- encoding: 如果指定了該參數(shù),則 stdin、stdout 和 stderr 可以接收字符串?dāng)?shù)據(jù),并以該編碼方式編碼。否則只接收 bytes 類(lèi)型的數(shù)據(jù)。
- shell:如果該參數(shù)為 True,將通過(guò)操作系統(tǒng)的 shell 執(zhí)行指定的命令。
subprocess.Popen()解析
Popen 是 subprocess的核心,子進(jìn)程的創(chuàng)建和管理
常用參數(shù):
args:shell命令,可以是字符串或者序列類(lèi)型(如:list,元組)
bufsize:緩沖區(qū)大小。當(dāng)創(chuàng)建標(biāo)準(zhǔn)流的管道對(duì)象時(shí)使用,默認(rèn)-1。
0:不使用緩沖區(qū)
1:表示行緩沖,僅當(dāng)universal_newlines=True時(shí)可用,也就是文本模式
正數(shù):表示緩沖區(qū)大小
負(fù)數(shù):表示使用系統(tǒng)默認(rèn)的緩沖區(qū)大小。
stdin, stdout, stderr:分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤句柄
preexec_fn:只在 Unix 平臺(tái)下有效,用于指定一個(gè)可執(zhí)行對(duì)象(callable object),它將在子進(jìn)程運(yùn)行之前被調(diào)用
shell:如果該參數(shù)為 True,將通過(guò)操作系統(tǒng)的 shell 執(zhí)行指定的命令。
cwd:用于設(shè)置子進(jìn)程的當(dāng)前目錄。
env:用于指定子進(jìn)程的環(huán)境變量。如果 env = None,子進(jìn)程的環(huán)境變量將從父進(jìn)程中繼承。
Popen 對(duì)象方法
- poll(): 檢查進(jìn)程是否終止,如果終止返回 returncode,否則返回 None。
- wait(timeout): 等待子進(jìn)程終止。
- communicate(input,timeout): 和子進(jìn)程交互,發(fā)送和讀取數(shù)據(jù)。
- send_signal(singnal): 發(fā)送信號(hào)到子進(jìn)程 。
- terminate(): 停止子進(jìn)程,也就是發(fā)送SIGTERM信號(hào)到子進(jìn)程。
- kill(): 殺死子進(jìn)程。發(fā)送 SIGKILL 信號(hào)到子進(jìn)程。
subprocess.run()案例
import subprocess print(subprocess.run(["pip", "list"]))
subprocess.call()案例
執(zhí)行命令,返回命令的結(jié)果和執(zhí)行狀態(tài),0或者非0
import subprocess result1 = subprocess.call(["pip", "list"]) print("*" * 30) print(result1) # 0 result2 = subprocess.call(["pip", "list1"]) print("*" * 30) print(result2) # -1 # 運(yùn)行結(jié)果 # ****************************** # 0 # ERROR: unknown command "list1" - maybe you meant "list" # ****************************** # 1
subprocess.check_call()案例
執(zhí)行命令,返回結(jié)果和狀態(tài),正常為0 ,執(zhí)行錯(cuò)誤則拋出異常
import subprocess result1 = subprocess.check_call(["pip", "list"]) print("*" * 30) print(result1) result2 = subprocess.check_call(["pip", "list2"]) print("*" * 30) print(result2) # 運(yùn)行結(jié)果,運(yùn)行錯(cuò)誤,拋出異常。 # ****************************** # 0 # raise CalledProcessError(retcode, cmd) # subprocess.CalledProcessError: Command '['pip', 'list2']' returned non-zero exit status 1.
subprocess.getstatusoutput()案例
接受字符串形式的命令,返回 一個(gè)元組形式的結(jié)果,第一個(gè)元素是命令執(zhí)行狀態(tài),第二個(gè)為執(zhí)行結(jié)果。
import subprocess result1 = subprocess.getstatusoutput("pip --version") print(result1) # 返回:第一個(gè)元素0, 第二個(gè)為執(zhí)行結(jié)果 # (0, 'pip 21.1.3 from C:\\lib\\site-packages\\pip (python 3.9)\n') result2 = subprocess.getstatusoutput("pip -vesi") print(result2) # 執(zhí)行失敗的案例 # (2, '\nUsage: \n pip <command> [options]\n\nno such option: -e')
subprocess.getoutput()案例
接受字符串形式的命令,放回執(zhí)行結(jié)果
import subprocess result1 = subprocess.getoutput("pip --version") print(result1) # 返回 # pip 21.1.3 from D:\\lib\site-packages\pip (python 3.9) result2 = subprocess.getoutput("pip -vesi") print(result2) # 返回 # Usage: # pip <command> [options] # # no such option: -e
subprocess.check_output()案例
執(zhí)行命令,返回執(zhí)行的結(jié)果,而不是打印
import subprocess result1 = subprocess.check_output("pip --version") print(result1) # 返回 # b'pip 21.1.3 from D:\\lib\\site-packages\\pip (python 3.9)\r\r\n' result2 = subprocess.check_output("pip -vesi") print(result2) # 返回 # raise CalledProcessError(retcode, process.args, # subprocess.CalledProcessError: Command 'pip -vesi' returned non-zero exit status 2.
subprocess.Popen()綜合案例
案例中視頻長(zhǎng)度代碼,請(qǐng)參考 - Python:獲取視頻時(shí)長(zhǎng) - 實(shí)踐場(chǎng)景
# coding:utf-8 import time import datetime import subprocess from analysis_video import video_duration file = r"C:\Users\videos\duck.mp4" # 請(qǐng)根據(jù)實(shí)際情況填寫(xiě)視頻路徑 video_time = video_duration(file) print(video_time) video_pid = subprocess.Popen(f'C:\Program Files\Windows Media Player\wmplayer.exe {file}') # poll(): 檢查進(jìn)程是否終止,如果終止返回 returncode,否則返回 None。 print(f"now:{datetime.datetime.now()}. - 當(dāng)前返回狀態(tài):{video_pid.poll()}") # now:2021-11-28 11:20:48.504796. - 當(dāng)前返回狀態(tài):None # 獲取當(dāng)前執(zhí)行子shell的程序的進(jìn)程號(hào) print("當(dāng)前執(zhí)行進(jìn)程號(hào)為:{}".format(video_pid.pid)) sleeps = int(video_time) + 2 print(f"根據(jù)視頻時(shí)長(zhǎng)等待:{sleeps}秒") time.sleep(sleeps) # kill(): 殺死子進(jìn)程。發(fā)送 SIGKILL 信號(hào)到子進(jìn)程。 video_pid.kill() time.sleep(1) print(f"now:{datetime.datetime.now()}. - 當(dāng)前返回狀態(tài):{video_pid.poll()}") # now:2021-11-28 11:21:05.520822. - 當(dāng)前返回狀態(tài):1 # wait() # 等待命令執(zhí)行完成,并且返回結(jié)果狀態(tài) print(video_pid.wait()) # 1
運(yùn)行結(jié)果:
附,各種信號(hào)總結(jié)
SIGHUP 終止進(jìn)程 終端線(xiàn)路掛斷
SIGINT 終止進(jìn)程 中斷進(jìn)程
SIGQUIT 建立CORE文件終止進(jìn)程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟蹤自陷
SIGBUS 建立CORE文件 總線(xiàn)錯(cuò)誤
SIGSEGV 建立CORE文件 段非法錯(cuò)誤
SIGFPE 建立CORE文件 浮點(diǎn)異常
SIGIOT 建立CORE文件 執(zhí)行I/O自陷
SIGKILL 終止進(jìn)程 殺死進(jìn)程
SIGPIPE 終止進(jìn)程 向一個(gè)沒(méi)有讀進(jìn)程的管道寫(xiě)數(shù)據(jù)
SIGALARM 終止進(jìn)程 計(jì)時(shí)器到時(shí)
SIGTERM 終止進(jìn)程 軟件終止信號(hào)
SIGSTOP 停止進(jìn)程 非終端來(lái)的停止信號(hào)
SIGTSTP 停止進(jìn)程 終端來(lái)的停止信號(hào)
SIGCONT 忽略信號(hào) 繼續(xù)執(zhí)行一個(gè)停止的進(jìn)程
SIGURG 忽略信號(hào) I/O緊急信號(hào)
SIGIO 忽略信號(hào) 描述符上可以進(jìn)行I/O
SIGCHLD 忽略信號(hào) 當(dāng)子進(jìn)程停止或退出時(shí)通知父進(jìn)程
SIGTTOU 停止進(jìn)程 后臺(tái)進(jìn)程寫(xiě)終端
SIGTTIN 停止進(jìn)程 后臺(tái)進(jìn)程讀終端
SIGXGPU 終止進(jìn)程 CPU時(shí)限超時(shí)
SIGXFSZ 終止進(jìn)程 文件長(zhǎng)度過(guò)長(zhǎng)
SIGWINCH 忽略信號(hào) 窗口大小發(fā)生變化
SIGPROF 終止進(jìn)程 統(tǒng)計(jì)分布圖用計(jì)時(shí)器到時(shí)
SIGUSR1 終止進(jìn)程 用戶(hù)定義信號(hào)1
SIGUSR2 終止進(jìn)程 用戶(hù)定義信號(hào)2
SIGVTALRM 終止進(jìn)程 虛擬計(jì)時(shí)器到時(shí)
以上就是一文搞懂Python中subprocess模塊的使用的詳細(xì)內(nèi)容,更多關(guān)于Python subprocess模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)字符串匹配的KMP算法
KMP算法的關(guān)鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。這篇文章主要介紹了Python實(shí)現(xiàn)字符串匹配的KMP算法,需要的朋友可以參考下2019-04-04Python?pandas?DataFrame基礎(chǔ)運(yùn)算及空值填充詳解
pandas除了可以drop含有空值的數(shù)據(jù)之外,當(dāng)然也可以用來(lái)填充空值,下面這篇文章主要給大家介紹了關(guān)于Python?pandas?DataFrame基礎(chǔ)運(yùn)算及空值填充的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07用Python實(shí)現(xiàn)局域網(wǎng)控制電腦
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)局域網(wǎng)控制電腦,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01使用TensorFlow-Slim進(jìn)行圖像分類(lèi)的實(shí)現(xiàn)
這篇文章主要介紹了使用TensorFlow-Slim進(jìn)行圖像分類(lèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python基于PycURL實(shí)現(xiàn)POST的方法
這篇文章主要介紹了Python基于PycURL實(shí)現(xiàn)POST的方法,涉及Python實(shí)現(xiàn)curl傳遞post數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07Windows下實(shí)現(xiàn)Python2和Python3兩個(gè)版共存的方法
這篇文章主要介紹了Windows下實(shí)現(xiàn)Python2和Python3兩個(gè)版共存的方法,本文詳細(xì)的給出了操作步驟和設(shè)置完成后的使用方法,需要的朋友可以參考下2015-06-06python PIL和CV對(duì) 圖片的讀取,顯示,裁剪,保存實(shí)現(xiàn)方法
今天小編就為大家分享一篇python PIL和CV對(duì) 圖片的讀取,顯示,裁剪,保存實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06基于Python實(shí)現(xiàn)圖像文字識(shí)別OCR工具
在工作、生活中常常會(huì)用到,比如票據(jù)、漫畫(huà)、掃描件、照片的文本提取。本文主要介紹了基于PyQt + PaddleOCR實(shí)現(xiàn)的一個(gè)桌面端的OCR工具,用于快速實(shí)現(xiàn)圖片中文本區(qū)域自動(dòng)檢測(cè)+文本自動(dòng)識(shí)別,需要的朋友可以參考一下2021-12-12