python學(xué)習(xí)之subprocess模塊詳解
subprocess功能:創(chuàng)建子進(jìn)程,并連接他的輸入、輸出和錯(cuò)誤管道,獲取其返回狀態(tài)(可以在python代碼中執(zhí)行操作系統(tǒng)級(jí)別的命令)
1. subprocess.run()
功能:執(zhí)行args參數(shù)所表示的命令,等待命令結(jié)束,并返回一個(gè)CompletedProcess類型對(duì)象
1.1. 參數(shù)介紹
subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,timeout=None,check=False,encoding=None,errors=None)
- args:表示要執(zhí)行的命令,必須是字符串或字符串參數(shù)列表
- Stdin, stdout, stderr:子進(jìn)程的標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤,其值可以是subprocess.PIPE, subporcess.DEVNULL, 一個(gè)已經(jīng)存在的文件描述符、已經(jīng)打開的文件對(duì)象或者None
- timeout:設(shè)置命令超時(shí)時(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類型的數(shù)據(jù)
- shell:若該參數(shù)為True,將通過操作系統(tǒng)的shell執(zhí)行指定命令
1.1.1 subprocess.CompletedProcess
run()的返回值,表示一個(gè)進(jìn)程結(jié)束了。CompletedProcess類有下面這些屬性
- args:?jiǎn)?dòng)進(jìn)程的參數(shù),通常是一個(gè)列表或字符串
- returncode:進(jìn)程結(jié)束狀態(tài)返回碼,0表示成功狀態(tài)
- stdout:獲取子進(jìn)程的stdout,通常為bytes類型序列,None表示沒有捕獲值。
- stderr:獲取子進(jìn)程的錯(cuò)誤信息,通常為bytes類型序列,None表示沒有捕獲值
- check_returncode():檢查返回碼,若返回狀態(tài)碼不為0,彈出calledProcessError異常
1.1.2 subprocess.DEVNULL
特殊值,用于傳遞給stdout, stdin和stderr參數(shù)
1.1.3 subprocess.PIPE
管道,可傳遞給stdout, stdin, stderr參數(shù)
1.1.4 subprocess.STDOUT
特殊值,可傳遞給stderr參數(shù),表示stdout和stderr合并輸出,可以使用read(), readline(), readlines()等方法
1.1.5 args與shell
- args參數(shù)可以接收一個(gè)字符串,也可以傳遞字符串分割列表
- shell參數(shù)默認(rèn)為False,設(shè)置為True的時(shí)候表示使用操作系統(tǒng)的shell執(zhí)行命令,當(dāng)args為字符串時(shí),必須指定shell=True;當(dāng)args是個(gè)列表的時(shí)候,shell保持默認(rèn)的False
1.2. 獲取執(zhí)行結(jié)果
run()方法返回的是一個(gè)completedProcess類型對(duì)象,而非執(zhí)行結(jié)果。如果要獲取命令執(zhí)行的結(jié)果或信息,在調(diào)用run()方法的時(shí)候,需要指定stdout=sunprocess.PIPE,結(jié)果將會(huì)以bytes類型保存在stdout屬性中
1.2.1. 交互式輸入
run()方法的stdin參數(shù)可以接收一個(gè)文件句柄,如下
import subprocess file=open("d:\\1.txt") ret=subprocess.run('python',stdin=file,stdout=subprocess.PIPE,shell=True) print(ret.stdout)
2. subprocess.Popen()
其用法和參數(shù)與run()基本類同,可創(chuàng)建和管理子進(jìn)程,但是它的返回值是一個(gè)Popen對(duì)象,而不是CompletedProcess對(duì)象
2.1 參數(shù)介紹
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
- args:shell命令,可以是字符串或者字符序列
- bufsize:緩沖區(qū)大小,默認(rèn)-1,用于創(chuàng)建標(biāo)準(zhǔn)流的管道對(duì)象
- 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,將通過操作系統(tǒng)的 shell 執(zhí)行指定的命令。
- cwd:用于設(shè)置子進(jìn)程的當(dāng)前目錄。
- env:用于指定子進(jìn)程的環(huán)境變量。如果 env = None,子進(jìn)程的環(huán)境變量將從父進(jìn)程中繼承。
2.1.1 subprocess.Popen可調(diào)用的方法
- poll():檢查進(jìn)程是否終止
- wait():等待子進(jìn)程終止
- communicate(input, timeout):和子進(jìn)程交互,發(fā)送和讀取數(shù)據(jù)
- input的數(shù)據(jù)類型必須是字節(jié)串,若universal_newlines=True,則input參數(shù)的數(shù)據(jù)類型必須是字符串
- 該方法返回一個(gè)元組(stdout_data, stderr_data),字節(jié)串或字符串
- timeout指定的秒數(shù)后該進(jìn)程還沒結(jié)束,將會(huì)拋出TimeoutExpired異常
- send_signal(signal):發(fā)送信號(hào)到子進(jìn)程
- terminate():停止子進(jìn)程,即發(fā)送SIGTERM信號(hào)到子進(jìn)程
- kill():殺死子進(jìn)程,發(fā)送SIGKILL
2.2 實(shí)例
Popen對(duì)象的stdin, stdout, stderr是三個(gè)文件句柄,可以像文件那樣讀寫,通過subprocess.stdin.write()可以輸入數(shù)據(jù),subprocess.Popen().stdout.read()可以輸出數(shù)據(jù)
import subprocess s=subprocess.Popen('python3',stdout=subprocess.PIPE,stdin=subprocess.PIPE,shell=True) s.stdin.write(b'import os\n') s.stdin.write(b'print(os.environ)') s.stdin.close()
3. subprocess常用函數(shù)
函數(shù) | 使用說明 |
---|---|
subprocess.run() | 執(zhí)行args參數(shù)所表示的命令,執(zhí)行完成后返回CompletedProcess |
subprocess.call() | 執(zhí)行指定的命令,返回命令執(zhí)行狀態(tài),類似os.system(cmd) |
subprocess.check_call() | 等價(jià)于subprocess.run(…,check=True) |
subprocess.check_output() | 執(zhí)行指定命令,狀態(tài)碼為0則返回命令執(zhí)行結(jié)果,否則拋出異常 |
subprocess.getoutput() | 接收字符串格式的命令,執(zhí)行并返回結(jié)果,類似于os.popen(cmd).read()和commands.getoutput(cmd) |
subprocess.getstatusoutput() | 執(zhí)行cmd命令,返回元組(命令執(zhí)行狀態(tài),命令執(zhí)行結(jié)果輸出) |
附:python subprocess.run() 執(zhí)行py腳本并等待該腳本執(zhí)行完成
要使用 subprocess.run()
執(zhí)行 Python 腳本并等待腳本執(zhí)行完成,可以按照以下方式進(jìn)行:
import subprocess # 腳本的文件路徑 script_path = "/path/to/your/script.py" # 使用 subprocess.run() 執(zhí)行腳本 subprocess.run(["python", script_path], capture_output=True, text=True) # 程序會(huì)在這里等待腳本執(zhí)行完成
在上述代碼中:
"python"
是要執(zhí)行的命令。[script_path]
是命令的參數(shù),即你要執(zhí)行的Python腳本的路徑。capture_output=True
參數(shù)表示捕獲子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流。返回的結(jié)果將會(huì)是一個(gè)CompletedProcess
對(duì)象,其stdout
和stderr
屬性分別包含標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的內(nèi)容。text=True
參數(shù)表示將捕獲的輸出以文本形式返回(在Python 3.7及以上版本有效)。
subprocess.run()
會(huì)阻塞當(dāng)前進(jìn)程,直到被調(diào)用的命令執(zhí)行完成。執(zhí)行完成后,程序才會(huì)繼續(xù)執(zhí)行后續(xù)的代碼。如果你不想捕獲輸出,可以去掉 capture_output
參數(shù)。
總結(jié)
到此這篇關(guān)于python學(xué)習(xí)之subprocess模塊詳解的文章就介紹到這了,更多相關(guān)python之subprocess模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的引用知識(shí)點(diǎn)總結(jié)
在本文里我們給大家整理了關(guān)于Python中的引用知識(shí)點(diǎn)以及相關(guān)代碼總結(jié),需要的朋友們跟著學(xué)習(xí)下。2019-05-05opencv python簡(jiǎn)易文檔之圖片基本操作指南
OpenCv除了可以獲取圖像之外,還可以對(duì)圖像進(jìn)行一下處理操作,下面這篇文章主要給大家介紹了關(guān)于opencv python簡(jiǎn)易文檔之圖片基本操作的相關(guān)資料,需要的朋友可以參考下2021-08-08OpenCV特征提取與檢測(cè)之Shi-Tomasi角點(diǎn)檢測(cè)器
在角點(diǎn)檢測(cè)的世界里哈瑞斯無疑是最重要的方法之一,但Shi-Tomasi作為改進(jìn)的算法也有很大應(yīng)用場(chǎng)景,尤其是動(dòng)態(tài)跟蹤用的還比較多,這篇文章主要給大家介紹了關(guān)于OpenCV特征提取與檢測(cè)之Shi-Tomasi角點(diǎn)檢測(cè)器的相關(guān)資料,需要的朋友可以參考下2021-08-08Python實(shí)現(xiàn)windows自動(dòng)關(guān)機(jī)功能
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)windows自動(dòng)關(guān)機(jī)功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2025-01-01Python利用openpyxl庫(kù)遍歷Sheet的實(shí)例
今天小編就為大家?guī)硪黄狿ython利用openpyxl庫(kù)遍歷Sheet的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹
這篇文章主要介紹了基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01python PIL Image 圖像處理基本操作實(shí)例
這篇文章主要介紹了python PIL Image 圖像處理基本操作實(shí)例包括圖片加載、灰度圖,圖像通道分離和合并,在圖像上輸出文字,圖像縮放,圖像閾值分割、 二值化,圖像裁剪需要的朋友可以參考下2022-04-04python實(shí)現(xiàn)簡(jiǎn)單加密解密機(jī)制
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單加密解密機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03pytorch實(shí)現(xiàn)特殊的Module--Sqeuential三種寫法
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)特殊的Module--Sqeuential三種寫法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01RuntimeError:CUDA?out?of?memory多種場(chǎng)景下的解決方案
若遇到RuntimeError:?CUDA?out?of?memory錯(cuò)誤,通常意味著GPU內(nèi)存不足以處理當(dāng)前的計(jì)算需求,本文就來介紹一下多種場(chǎng)景下的解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02