python學(xué)習(xí)之subprocess模塊詳解
subprocess功能:創(chuàng)建子進(jìn)程,并連接他的輸入、輸出和錯誤管道,獲取其返回狀態(tài)(可以在python代碼中執(zhí)行操作系統(tǒng)級別的命令)
1. subprocess.run()
功能:執(zhí)行args參數(shù)所表示的命令,等待命令結(jié)束,并返回一個CompletedProcess類型對象
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)輸入、輸出和錯誤,其值可以是subprocess.PIPE, subporcess.DEVNULL, 一個已經(jīng)存在的文件描述符、已經(jīng)打開的文件對象或者None
- timeout:設(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()的返回值,表示一個進(jìn)程結(jié)束了。CompletedProcess類有下面這些屬性
- args:啟動進(jìn)程的參數(shù),通常是一個列表或字符串
- returncode:進(jìn)程結(jié)束狀態(tài)返回碼,0表示成功狀態(tài)
- stdout:獲取子進(jìn)程的stdout,通常為bytes類型序列,None表示沒有捕獲值。
- stderr:獲取子進(jìn)程的錯誤信息,通常為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ù)可以接收一個字符串,也可以傳遞字符串分割列表
- shell參數(shù)默認(rèn)為False,設(shè)置為True的時候表示使用操作系統(tǒng)的shell執(zhí)行命令,當(dāng)args為字符串時,必須指定shell=True;當(dāng)args是個列表的時候,shell保持默認(rèn)的False
1.2. 獲取執(zhí)行結(jié)果
run()方法返回的是一個completedProcess類型對象,而非執(zhí)行結(jié)果。如果要獲取命令執(zhí)行的結(jié)果或信息,在調(diào)用run()方法的時候,需要指定stdout=sunprocess.PIPE,結(jié)果將會以bytes類型保存在stdout屬性中
1.2.1. 交互式輸入
run()方法的stdin參數(shù)可以接收一個文件句柄,如下
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)程,但是它的返回值是一個Popen對象,而不是CompletedProcess對象
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)流的管道對象
- 0:不使用緩沖區(qū)
- 1:表示行緩沖,僅當(dāng)universal_newlines=True時可用,即文本模式
- 正數(shù):表示緩沖區(qū)大小
- 負(fù)數(shù):表示使用系統(tǒng)默認(rèn)的緩沖區(qū)大小。
- stdin, stdout, stderr:分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯誤句柄
- preexec_fn:只在 Unix 平臺下有效,用于指定一個可執(zhí)行對象(callable object),它將在子進(jì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ù)類型必須是字符串
- 該方法返回一個元組(stdout_data, stderr_data),字節(jié)串或字符串
- timeout指定的秒數(shù)后該進(jìn)程還沒結(jié)束,將會拋出TimeoutExpired異常
- send_signal(signal):發(fā)送信號到子進(jìn)程
- terminate():停止子進(jìn)程,即發(fā)送SIGTERM信號到子進(jìn)程
- kill():殺死子進(jìn)程,發(fā)送SIGKILL
2.2 實例
Popen對象的stdin, stdout, stderr是三個文件句柄,可以像文件那樣讀寫,通過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() | 等價于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) # 程序會在這里等待腳本執(zhí)行完成
在上述代碼中:
"python"
是要執(zhí)行的命令。[script_path]
是命令的參數(shù),即你要執(zhí)行的Python腳本的路徑。capture_output=True
參數(shù)表示捕獲子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤流。返回的結(jié)果將會是一個CompletedProcess
對象,其stdout
和stderr
屬性分別包含標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤的內(nèi)容。text=True
參數(shù)表示將捕獲的輸出以文本形式返回(在Python 3.7及以上版本有效)。
subprocess.run()
會阻塞當(dāng)前進(jìn)程,直到被調(diào)用的命令執(zhí)行完成。執(zhí)行完成后,程序才會繼續(xù)執(zhí)行后續(xù)的代碼。如果你不想捕獲輸出,可以去掉 capture_output
參數(shù)。
總結(jié)
到此這篇關(guān)于python學(xué)習(xí)之subprocess模塊詳解的文章就介紹到這了,更多相關(guān)python之subprocess模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)windows自動關(guān)機功能
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)windows自動關(guān)機功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下2025-01-01pytorch實現(xiàn)特殊的Module--Sqeuential三種寫法
今天小編就為大家分享一篇pytorch實現(xiàn)特殊的Module--Sqeuential三種寫法。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01RuntimeError:CUDA?out?of?memory多種場景下的解決方案
若遇到RuntimeError:?CUDA?out?of?memory錯誤,通常意味著GPU內(nèi)存不足以處理當(dāng)前的計算需求,本文就來介紹一下多種場景下的解決方案,具有一定的參考價值,感興趣的可以了解一下2024-02-02