常量
subprocess.DEVNULL:可傳遞給
stdin
,
stdout
,
stderr
參數的特殊值,意味着将使用特殊檔案
os.devnull
重定向輸入輸出
subprocess.PIPE:可傳遞給
stdin
,
stdout
,
stderr
參數的特殊值,意味着使用管道重定向輸入輸出
subprocess.STDOUT:可傳遞給
stderr
參數的特殊值,表示重定向标準錯誤到标準輸出
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=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
args:字元串或序列。如果是序列,則args中的第一個元素是要執行的程式;如果是字元串,解釋執行與平台有關,在POSIX系統args将被解釋為要執行的程式的名稱或路徑(前提是不傳遞任何參數給程式)。
shell:指定是否使用shell作為要執行的程式。如果設定為True,更推薦和字元串類型的args參數使用。
在POSIX系統,shell=True預設使用
/bin/sh
作為shell。如果args為字元串,該字元串表示要通過shell執行的指令;如果args為序列,第一個元素指定要執行的程式,其他元素視為參數。
在Windows系統,shell=True預設使用
COMSPEC
環境變量指定的shell,一般是
C:\WINDOWS\system32\cmd.exe
。唯一需要指定shell=True的場景是要執行的指令是shell内置的,如
dir
,
copy
。
bufsize:建立stdin/stdout/stderr管道檔案對象時作為對應的參數傳遞給
open()
函數。
0:不始用緩沖
1:使用行緩沖
其他正整數:緩沖大小
負整數(預設):使用系統預設值
executable:使用shell=True的場景很少。shell=True時,在POSIX系統上此參數表示指定一個新的shell程式替換預設shell
/bin/sh
。
stdin/stdout/stderr:分别指定程式執行的标準輸入,标準輸出,标準錯誤。可選值包括
PIPE
,
DEVNULL
,已存在的檔案描述符(正整數),已存在的檔案對象,None。子程序檔案句柄繼承自父程序。除此之外,stderr還可以是
STDOUT
,表示标準錯誤輸出重定向到标準輸出。
preexec_fn:限于POSIX系統,設定一個可調用對象,先于子程序中的程式執行。
close_fds:如果為False,檔案描述符遵循Inheritance of File Descriptors中描述的
inheritable
辨別。
如果為True,在POSIX系統下,在子程序執行前關閉除0,1,2外的檔案描述符。
pass_fds:限于POSIX,可選的檔案描述符序列,用于在父子程序間保持開放。隻要提供了此參數,close_fds強制設為True。
cwd:在子程序執行前改變工作目錄為cwd,可以是字元串或path-like對象。
restore_signals:限于POSIX,略
start_new_session:限于POSIX,略
env:dict對象,為新程序定義環境變量,替換繼承自父程序的變量。在Windows下,要運作
side-by-side assembly
必須包含可用的環境變量
SystemRoot
。如果指定了env,就必須提供程式執行依賴的所有環境變量
encoding/errors/text/universal_newlines:stdin/stdout/stderr預設以二進制模式打開。但如果指定了encoding/errors或者text為True,将使用指定的encoding和errors以文本模式打開stdin/stdout/stderr。universal_newlines參數等同于text,用于後向相容。
startupinfo:僅限于Windows,略
creationflags:僅限于Windows,略
方法
poll():檢查子程序是否終止。傳回None表示未終止,否則設定returncode屬性并傳回。
wait(timeout=None):如果子程序在timeout後沒有終止,抛出TimeoutExpired異常。否則設定returncode屬性并傳回。
communicate(input=None, timeout=None):程序互動:發送資料到stdin,讀取stdout或stderr的資料知道讀取到結束符。傳回(stdout_data, stderr_data)形式的元組,元組類型是string或byte。
input為None或要發送到子程序的資料,根據stream打開模式的不同,可以是string或byte類型。
如果要和程序的stdin互動,建立Popen對象時需要指定stdin=PIPE。類似的,傳回的tuple如果希望是非None,需要設定stdout=PIPE和/或stderr=PIPE。
如果子程序在timeout後沒有終止,抛出TimeoutExpired異常,但子程序并未kill掉,一個良好的應用應該kill掉子程序并結束互動:
proc = subprocess.Popen(...)
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
複制
send_signal(signal):發送信号到子程序
terminate():終止子程序。POSIX系統上,發送SIGTERM信号到子程序,Windows系統上會調用TerminateProcess()終止程序
kill():強制終止子程序。POSIX系統上,發送SIGKILL信号到子程序。Windows系統上kill()是terminate()的别名
屬性
args:傳入
Popen
構造器的第一個參數,list或string類型
stdin:如果傳遞給Popen的stdin參數是PIPE,該屬性表示string或byte類型的可寫stream對象。如果傳遞給Popen的stdin參數不是PIPE,此屬性值為None
stdout:與Popen.stdin相近,但stream對象是可讀的
stderr:與Popen.stdout相近
pid:子程序程序号。如果設定了shell=True,pid表示派生shell的程序号
returncode:子程序傳回碼,None表示程序未終止。負數-N表示程序被信号N終止(僅限POSIX)。
CompletedProcess
run()
函數運作的傳回值,表示程序執行完成。
屬性
args:傳入
run()
函數的第一個參數,list或string類型
returncode:子程序退出碼。如果為負數,表示程序因為某個信号退出
stdout:捕獲的子程序的标準輸出,預設為byte類型,如果
run()
函數調用時指定了encoding或errors,或設定了text=True則為string類型。如果未捕獲标準輸出傳回None
stderr:捕獲的子程序的标準錯誤,預設為byte類型,如果
run()
函數調用時指定了encoding或errors,或設定了text=True則為string類型。如果未捕獲标準錯誤傳回None
方法
check_returncode():如果returncode非0,抛出
CalledProcessError
異常
異常
subprocess.SubprocessError
subprocess子產品的異常基類
subprocess.TimeoutExpired
子程序執行逾時。
屬性
cmd:指令
timeout:秒為機關的時間
output:
run()
或
check_output()
函數捕獲到的子程序的輸出,否則為None
stdout:output屬性别名
stderr:
run()
函數捕獲到的子程序的錯誤輸出,否則為None
subprocess.CalledProcessError
check_call()
或
check_output()
函數傳回非0狀态碼時抛出。
屬性
returncode:子程序退出碼。如果為負數,表示程序因為某個信号退出
cmd:同TimeoutExpired
output:同TimeoutExpired
stdout:同TimeoutExpired
stderr:同TimeoutExpired