天天看點

python子產品之subprocess類與常量

常量

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