subprocess- 子流程管理

subprocess該模塊允許您生成新進程,連接到其輸入/輸出/錯誤管道,並獲取其返回代碼。該模塊打算替換幾個較舊的模塊和功能:
os.system
os.spawn*

使用模塊subprocess

推薦的調用子流程的方法是將該run() 功能用於它可以處理的所有用例。對於更高級的用例,Popen可以直接使用基礎接口。

該run()功能是在Python 3.5中添加的;如果您需要保留與舊版本的兼容性,請參見“ 舊版高級API”部分。

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

運行args描述的命令。等待命令完成,然後返回CompletedProcess實例。

上面顯示的參數僅僅是最常用的參數,下面在“ 常用參數”中進行	了描述(因此在縮寫簽名中使用了僅關鍵字表示法)。完整的函數簽名與Popen構造函數的簽名基本相同-該函數的大多數參數都傳遞給該接口。(timeout, input, check和capture_output不是。)

如果capture_output爲true,則將捕獲stdout和stderr。使用時,將Popen使用stdout=PIPE和自動創建內部對象 stderr=PIPE。的標準輸出和stderr的參數可能不能在相同的時間被供給capture_output。如果您希望捕獲並將這兩個流合併爲一個,請使用stdout=PIPE和,stderr=STDOUT 而不是capture_output。

在超時參數傳遞給Popen.communicate()。如果超時到期,子進程將被終止並等待。該 TimeoutExpired異常會被重新提出的子進程終止後。

該輸入參數被傳遞給Popen.communicate()並因此給 子過程的標準輸入。如果使用,則必須爲字節序列,如果指定了編碼或錯誤或文本爲true ,則必須爲字符串 。使用內部Popen對象時,它會使用自動創建 stdin=PIPE,並且stdin參數也不能使用。

如果check爲true,並且進程以非零退出代碼退出, CalledProcessError則會引發異常。該異常的屬性包含參數,退出代碼以及stdout和stderr(如果已捕獲)。

如果指定了編碼或錯誤,或者文本爲true,則使用指定的編碼和錯誤或io.TextIOWrapper默認設置,以文本模式打開stdin,stdout和stderr的文件對象。該universal_newlines參數等同於文本,並提供向後兼容性。默認情況下,文件對象以二進制模式打開。

如果env不是None,則它必須是爲新進程定義環境變量的映射。這些被用來代替繼承當前進程環境的默認行爲。它直接傳遞給Popen。

例子:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')

3.5版中的新功能。

3.6版中的更改:添加了編碼和錯誤參數

在3.7版中進行了更改:添加了text參數,作爲Universal_newlines的更易理解的別名。添加了capture_output參數。

class subprocess.CompletedProcess

來自的返回值run(),表示已完成的過程。

args
用於啓動進程的參數。這可以是列表或字符串。

returncode
子進程的退出狀態。通常,退出狀態爲0表示它已成功運行。

負值-N表示該子級已被信號終止 N(僅POSIX)。

stdout
從子進程中捕獲的標準輸出。一個字節序列,或者一個字符串(如果 run()使用編碼,錯誤或text = True調用)。 None如果未捕獲stdout。

stderr
從子進程中捕獲了stderr。一個字節序列,或者一個字符串(如果 run()使用編碼,錯誤或text = True調用)。 None如果未捕獲stderr。

check_returncode()
如果returncode爲非零,則引發CalledProcessError。

subprocess.DEVNULL

可以用作stdin,stdout或stderr參數的特殊值,Popen並指示os.devnull 將使用特殊文件。

subprocess.PIPE

可以用作stdin,stdout或stderr參數的特殊值,Popen指示應打開到標準流的管道。最有用的Popen.communicate()。

subprocess.STDOUT

可以用作stderr參數的特殊值,它Popen指示標準錯誤應與標準輸出進入同一句柄。

exception subprocess.SubprocessError

該模塊所有其他異常的基類。

exception subprocess.TimeoutExpired

SubprocessError的子類,在等待子進程超時時引發。

cmd
用於產生子進程的命令。

timeout
超時(以秒爲單位)。

output
子進程的輸出(如果被run()或 捕獲)check_output()。否則,None。

stdout
輸出的別名,用於與對稱stderr。

stderr
子進程的Stderr輸出(如果被捕獲)run()。否則,None。

版本3.3中的新功能。
在版本3.5中進行了更改:添加了stdout和stderr屬性

exception subprocess.CalledProcessError

SubprocessError的子類,當進程運行check_call()或返回非零退出狀態時引發check_output() 。

returncode
子進程的退出狀態。如果該過程由於信號而退出,則這將是負信號號。

cmd
用於產生子進程的命令。

output
子進程的輸出(如果被run()或 捕獲)check_output()。否則,None。

stdout
輸出的別名,用於與對稱stderr。

stderr
子進程的Stderr輸出(如果被捕獲)run()。否則,None。

常用參數

爲了支持各種用例,Popen構造函數(和便捷函數)接受大量可選參數。對於大多數典型用例,可以安全地將其中許多參數保留爲其默認值。最常用的參數是:

args是所有調用所必需的,並且應爲字符串或程序參數序列。通常最好提供一個參數序列,因爲它允許模塊處理任何必需的參數轉義和引用(例如,允許在文件名中保留空格)。如果傳遞單個字符串,則必須使用shellTrue(請參見下文),否則該字符串必須簡單地命名要執行的程序而無需指定任何參數。

stdin,stdout和stderr分別指定執行程序的標準輸入,標準輸出和標準錯誤文件句柄。有效值爲PIPE,DEVNULL現有文件描述符(正整數),現有文件對象和None。 PIPE指示應該創建到子級的新管道。 DEVNULL表示os.devnull將使用特殊文件。使用默認設置時None,將不會發生重定向。子級的文件句柄將從父級繼承。另外,stderr可以是 STDOUT,它指示子進程的stderr數據應捕獲到與stdout相同的文件句柄中。

如果指定了編碼或錯誤,或者文本(也稱爲 Universal_newlines)爲true,則將使用調用中指定的編碼和錯誤或的默認值以文本模式打開文件對象stdin,stdout和stderr。io.TextIOWrapper

對於stdin,輸入中的行尾字符’\n’將轉換爲默認的行分隔符os.linesep。對於stdout和stderr,輸出中的所有行尾都將轉換爲’\n’。有關更多信息,請參見io.TextIOWrapper當類的構造函數的newline參數爲時該類的文檔None。

如果不使用文本模式,則stdin,stdout和stderr將作爲二進制流打開。不執行編碼或行尾轉換。

3.6版的新功能:添加了編碼和錯誤參數。

版本3.7中的新增功能:添加了text參數作爲Universal_newlines的別名。

注意 文件對象的newlines屬性Popen.stdin, Popen.stdout並且Popen.stderr不會通過該Popen.communicate()方法進行更新。

如果shell是True,則將通過Shell執行指定的命令。如果您主要將Python用於大多數系統外殼程序提供的增強控制流,並且仍然希望方便地訪問其他外殼程序功能(例如外殼程序管道,文件名通配符,環境變量擴展以及擴展~到用戶的主目錄),則這很有用。。但是請注意,Python本身提供了很多貝殼般的功能實現(特別是glob, fnmatch,os.walk(),os.path.expandvars(), os.path.expanduser(),和shutil)。

改變在3.3版本:當universal_newlines是True,類使用的編碼 locale.getpreferredencoding(False) 來代替locale.getpreferredencoding()。有關io.TextIOWrapper此更改的更多信息,請參見 課程。

POPEN構造

該模塊中的基礎流程創建和管理由Popen類處理。它提供了很大的靈活性,以便開發人員能夠處理便捷功能未涵蓋的不太常見的情況。

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=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

在新進程中執行子程序。在POSIX上,該類使用 os.execvp()類似行爲來執行子程序。在Windows上,該類使用Windows CreateProcess()函數。的參數 Popen如下。

args應該是程序參數的序列,或者是單個字符串。默認情況下,如果args是序列,則要執行的程序是args中的第一項。如果args是字符串,則解釋取決於平臺,並在下面進行描述。有關 默認行爲的其他區別,請參見shell和可執行參數。除非另有說明,否則建議將args作爲序列傳遞。

在POSIX上,如果args是字符串,則將該字符串解釋爲要執行的程序的名稱或路徑。但是,只有在不將參數傳遞給程序的情況下才能執行此操作。

>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!

在Windows上,如果args是一個序列,它將以Windows 上將參數序列轉換爲字符串中所述的方式轉換爲字符串。這是因爲底層CreateProcess()對字符串進行操作。

所述殼參數(默認爲False)指定是否使用殼作爲要執行的程序。如果shell是True,建議將args作爲字符串而不是序列傳遞。

在POSIX with上shell=True,shell默認爲/bin/sh。如果 args是字符串,則該字符串指定要通過外殼執行的命令。這意味着字符串的格式必須與在shell提示符下鍵入時的格式完全相同。例如,這包括在文件名中使用引號或反斜槓轉義。如果args是序列,則第一項指定命令字符串,任何其他項都將被視爲shell本身的其他參數。也就是說,Popen是否等效於:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

在Windows上shell=True,帶有COMSPEC環境變量指定默認外殼程序。shell=True在Windows上唯一需要指定的 是將要執行的命令內置到shell中(例如dir或copy)。您不需要 shell=True運行批處理文件或基於控制檯的可執行文件。

open()在創建stdin / stdout / stderr管道文件對象時,bufsize將作爲函數的相應參數提供 :

0 表示無緩衝(讀和寫是一個系統調用,並且可以返回短)

1表示行緩衝(僅universal_newlines=True在文本模式下可用)

任何其他正值表示使用大約該大小的緩衝區

負bufsize(默認值)表示將使用系統默認值io.DEFAULT_BUFFER_SIZE。

在3.3.1版中進行了更改:bufsize現在默認爲-1,以默認情況下啓用緩衝以匹配大多數代碼期望的行爲。在Python 3.2.4和3.3.1之前的版本中,它錯誤地默認設置爲0未緩衝且允許短讀取。這不是故意的,並且與大多數代碼所期望的不匹配Python 2的行爲。

該可執行文件參數指定的替代程序來執行。很少需要。何時shell=False,可執行文件替換由args指定執行的程序。但是,原始參數仍會傳遞給程序。大多數程序將args指定的程序當作命令名,然後可以與實際執行的程序不同。在POSIX上,args名稱成爲實用程序(例如ps)中可執行文件的顯示名稱 。如果shell=True在POSIX上,可執行參數爲默認值指定替換殼/bin/sh。

stdin,stdout和stderr分別指定執行程序的標準輸入,標準輸出和標準錯誤文件句柄。有效值爲PIPE,DEVNULL現有文件描述符(正整數),現有文件對象和None。 PIPE 指示應該創建到子級的新管道。 DEVNULL 表示os.devnull將使用特殊文件。使用默認設置時None,將不會發生重定向。子級的文件句柄將從父級繼承。另外,stderr可以爲 STDOUT,指示應將來自應用程序的stderr數據捕獲到與stdout相同的文件句柄中。

如果將preexec_fn設置爲可調用對象,則將在執行子級之前在子進程中調用此對象。(僅POSIX)

警告 如果您的應用程序中存在線程,則preexec_fn參數不安全使用。在調用exec之前,子進程可能會死鎖。如果您必須使用它,請保持瑣碎!最小化您要調用的庫的數量。

注意 如果需要爲子進程修改環境,請使用env 參數,而不要在preexec_fn中使用它。該start_new_session參數可以採用以前普遍使用的地點preexec_fn調用os.setsid()的孩子。

如果close_fds是真實的,所有的文件描述符除外0,1並 2執行子進程之前,將被關閉。否則,當close_fds是假的,如在文件描述符服從他們的可繼承標誌文件描述符的傳承。

在Windows上,如果close_fds爲true,則子進程將不會繼承任何句柄,除非在的handle_list元素中 顯式傳遞STARTUPINFO.lpAttributeList或通過標準的句柄重定向。

在版本3.2中更改:close_fds的默認值已從更改False爲上述內容。

在版本3.7中更改:在Windows 上,重定向標準句柄時,close_fds的默認值已從更改False爲 True。現在可以在重定向標準句柄時將close_fds設置爲True。

pass_fds是可選的文件描述符序列,用於保持父級和子級之間的打開狀態。提供任何pass_fds都會強制 close_fds爲True。(僅POSIX)

:在3.2版本中的新的pass_fds加入參數。

如果cwd不是None,則該函數在執行子級之前將工作目錄更改爲 cwd。 CWD可以是一個str和 路徑狀對象。特別是, 如果可執行路徑是相對路徑,則該函數將查找相對於cwd的可執行文件(或args中的第一項)。

在版本3.6中更改:cwd參數接受類似路徑的對象。

如果restore_signals爲true(默認設置),則在執行之前,子進程中將Python設置爲SIG_IGN的所有信號都還原爲SIG_DFL。當前,這包括SIGPIPE,SIGXFZ和SIGXFSZ信號。(僅POSIX)

在版本3.2中更改:添加了restore_signals。

如果start_new_session是真setsid()系統調用將在之前的執行的子進程進行子。(僅POSIX)

在版本3.2中進行了更改:添加了start_new_session。

如果env不是None,則它必須是爲新進程定義環境變量的映射。這些被用來代替繼承當前進程環境的默認行爲。

注意 如果指定,env必須提供程序執行所需的任何變量。在Windows上,爲了運行並行程序集,指定的env 必須包含有效的SystemRoot。
如果指定了編碼或錯誤,或者文本爲true,則文件對象 stdin,stdout和stderr將以指定的編碼和錯誤以文本模式打開,如上面“ 常用參數”中所述。該universal_newlines參數等同於文本,並提供向後兼容性。默認情況下,文件對象以二進制模式打開。

3.6版中的新功能:添加了編碼和錯誤。

3.7版中的新功能:文本被添加爲Universal_newlines的可讀性更高的別名。

如果給定,startupinfo將是一個STARTUPINFO對象,該對象將傳遞給基礎CreateProcess函數。 creationflags(如果提供)可以是以下一個或多個標誌:

CREATE_NEW_CONSOLE

CREATE_NEW_PROCESS_GROUP

ABOVE_NORMAL_PRIORITY_CLASS

BELOW_NORMAL_PRIORITY_CLASS

HIGH_PRIORITY_CLASS

IDLE_PRIORITY_CLASS

NORMAL_PRIORITY_CLASS

REALTIME_PRIORITY_CLASS

CREATE_NO_WINDOW

DETACHED_PROCESS

CREATE_DEFAULT_ERROR_MODE

CREATE_BREAKAWAY_FROM_JOB

通過以下with語句,可以將Popen對象用作上下文管理器:在退出時,將關閉標準文件描述符,並等待該過程。

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())

Exceptions

在新程序開始執行之前,子進程中引發的異常將在父進程中重新引發。

提出的最常見的例外是OSError。例如,在嘗試執行不存在的文件時,就會發生這種情況。應用程序應爲OSError例外做好準備 。

ValueError如果Popen使用無效參數調用A,則會引發A。

check_call()如果被調用的進程返回一個非零的返回碼,check_output()它將提高 CalledProcessError。

接受超時參數的所有函數和方法,例如 call()和,如果超時在進程退出之前到期,Popen.communicate()則會增加TimeoutExpired。

此模塊中定義的異常均繼承自。SubprocessError

:在3.3版本中的新的加入的基類。SubprocessError

安全注意事項

與某些其他popen函數不同,此實現絕不會隱式調用系統外殼程序。這意味着所有字符(包括外殼元字符)都可以安全地傳遞給子進程。如果通過顯式調用了外殼shell=True程序,則應用程序有責任確保適當地引用所有空格和元字符以避免 外殼程序注入 漏洞。

使用時shell=True,該shlex.quote()函數可用於適當地轉義將用於構造Shell命令的字符串中的空格和Shell元字符。

POPEN對象

Popen該類的實例具有以下方法:

Popen.poll()

檢查子進程是否已終止。設置並返回 returncode屬性。否則,返回None。

Popen.wait(timeout = None )

等待子進程終止。設置並返回 returncode屬性。

如果該過程在超時秒後仍未終止,請引發 TimeoutExpired異常。捕獲此異常並重試等待是安全的。

注意 使用stdout=PIPE或時,這將stderr=PIPE 導致死鎖,並且子進程會向管道生成足夠的輸出,從而阻塞等待OS管道緩衝區接受更多數據的等待。使用Popen.communicate()管道時可避免這種情況。

注意 該功能是使用忙循環(非阻塞呼叫和短暫睡眠)實現的。使用asyncio模塊進行異步等待:請參閱。asyncio.create_subprocess_exec

Popen.communicate(input = None,timeout = None )

與進程交互:將數據發送到stdin。從stdout和stderr讀取數據,直到到達文件末尾。等待進程終止。可選的 輸入參數應該是要發送到子進程的None數據,如果沒有數據要發送到子進程 ,則爲。如果以文本模式打開流,則輸入必須爲字符串。否則,它必須是字節。

communicate()返回一個元組。如果以文本模式打開流,則數據將爲字符串;否則,數據爲字符串。否則爲字節。(stdout_data, stderr_data)

請注意,如果要將數據發送到進程的stdin,則需要使用創建Popen對象stdin=PIPE。同樣,要獲得None結果元組以外的任何內容 ,您也需要給出stdout=PIPE和/或 stderr=PIPE。

如果該過程在超時秒後仍未終止, TimeoutExpired則會引發異常。捕獲此異常並重試通信不會丟失任何輸出。

如果超時到期,子進程不會被殺死,因此爲了正確清理行爲良好的應用程序,應該殺死子進程並完成通信:
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

注意 讀取的數據緩存在內存中,因此,如果數據大小很大或沒有限制,請不要使用此方法。

在版本3.3中更改:添加了超時。

Popen.send_signal(signal)

將信號發送給孩子。
注意 在Windows上,SIGTERM是的別名terminate()。可以將CTRL_C_EVENT和CTRL_BREAK_EVENT發送到以creationflags 參數(包括CREATE_NEW_PROCESS_GROUP)啓動的進程。

Popen.terminate()

阻止孩子 在Posix OS上,該方法將SIGTERM發送給子級。在Windows上,將調用Win32 API函數TerminateProcess()來停止子級。

Popen.kill()

殺死子進程。在Posix OS上,該功能將SIGKILL發送給子級。在Windows上kill()是的別名terminate()。

以下屬性也是可用的:
Popen.args

該ARGS因爲它傳遞給參數Popen的程序參數的序列或者一個字符串- 。

版本3.3中的新功能。

Popen.stdin

如果stdin參數爲PIPE,則此屬性是由返回的可寫流對象open()。如果 指定了encoding或errors參數,或者Universal_newlines參數爲True,則該流爲文本流,否則爲字節流。如果不是stdin 參數PIPE,則此屬性爲None。

Popen.stdout

如果stdout參數爲PIPE,則此屬性是可讀的流對象,由返回open()。從流中讀取將提供子進程的輸出。如果指定了encoding或errors參數,或者Universal_newlines參數爲True,則該流爲文本流,否則爲字節流。如果不是stdout參數 PIPE,則此屬性爲None。

Popen.stderr

如果stderr參數爲PIPE,則此屬性是可讀的流對象,由返回open()。從流中讀取將提供子進程的錯誤輸出。如果指定了encoding或errors參數,或者Universal_newlines參數爲True,則該流爲文本流,否則爲字節流。如果stderr參數不是PIPE,則此屬性爲None。

警告 使用communicate()而不是.stdin.write, .stdout.read或.stderr.read避免由於其他任何OS管道緩衝區填充和阻塞子進程而導致死鎖。

Popen.pid

子進程的進程ID。
請注意,如果將shell參數設置爲True,則這是生成的shell的進程ID。

Popen.returncode
子返回碼,由poll()和設置(並由wait()間接設置communicate())。一個None值表示進程尚未結束。
負值-N表示該子級已被信號終止 N(僅POSIX)。

Windows Popen幫助器

該STARTUPINFO級和以下常量僅適用於Windows。

class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

Windows STARTUPINFO 結構的部分支持 用於Popen創建。可以通過將以下屬性作爲僅關鍵字的參數傳遞來設置以下屬性。

在版本3.7中更改:添加了僅關鍵字參數支持。

dwFlags
一個位域,確定STARTUPINFO 在進程創建窗口時是否使用某些屬性。

si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW

hStdInput
如果dwFlags指定STARTF_USESTDHANDLES,則此屬性是流程的標準輸入句柄。如果 STARTF_USESTDHANDLES未指定,則標準輸入的默認值爲鍵盤緩衝區。

hStdOutput
如果dwFlags指定STARTF_USESTDHANDLES,則此屬性是流程的標準輸出句柄。否則,將忽略此屬性,標準輸出的默認值是控制檯窗口的緩衝區。

hStdError
如果dwFlags指定STARTF_USESTDHANDLES,則此屬性是流程的標準錯誤句柄。否則,將忽略此屬性,並且標準錯誤的默認值是控制檯窗口的緩衝區。

wShowWindow
如果dwFlags指定STARTF_USESHOWWINDOW,則此屬性可以是ShowWindow 函數的nCmdShow 參數中 可以指定的任何值,但除外。否則,將忽略此屬性。SW_SHOWDEFAULT

SW_HIDE爲該屬性提供。Popen與一起使用時 使用shell=True。

lpAttributeList

有關過程創建的其他屬性的字典 STARTUPINFOEX,請參見 UpdateProcThreadAttribute。

支持的屬性:
	handle_list
		將被繼承的句柄序列。如果非空,則close_fds必須爲true。
		os.set_handle_inheritable()傳遞給Popen 構造函數時,必須暫時使這些句柄可繼承,否則OSError將因Windows錯誤ERROR_INVALID_PARAMETER(87)引發 該句柄 。
		警告 在多線程流程中,將此功能與併發調用其他繼承所有句柄的流程創建函數(例如)結合使用時,請小心避免泄漏標記爲可繼承的句柄os.system()。這也適用於標準句柄重定向,它臨時創建可繼承的句柄。
		
	3.7版中的新功能。

Windows常量

該模塊公開以下常量。subprocess

subprocess.STD_INPUT_HANDLE
標準輸入設備。最初,這是控制檯輸入緩衝區 CONIN$。

subprocess.STD_OUTPUT_HANDLE
標準輸出設備。最初,這是活動的控制檯屏幕緩衝區CONOUT$。

subprocess.STD_ERROR_HANDLE
標準錯誤設備。最初,這是活動的控制檯屏幕緩衝區CONOUT$。

subprocess.SW_HIDE
隱藏窗口。另一個窗口將被激活。

subprocess.STARTF_USESTDHANDLES
指定STARTUPINFO.hStdInput, STARTUPINFO.hStdOutput和STARTUPINFO.hStdError屬性包含的附加信息。

subprocess.STARTF_USESHOWWINDOW
指定該STARTUPINFO.wShowWindow屬性包含其他信息。

subprocess.CREATE_NEW_CONSOLE
新進程具有一個新的控制檯,而不是繼承其父級的控制檯(默認)。

subprocess.CREATE_NEW_PROCESS_GROUP
一個參數,用於指定將創建一個新的流程組。 在子流程上使用此標誌是必需的。Popen creationflagsos.kill()

如果CREATE_NEW_CONSOLE指定,則忽略此標誌。

subprocess.ABOVE_NORMAL_PRIORITY_CLASS
一個參數指定一個新的進程將有一個高於平均水平的優先級。Popen creationflags

3.7版中的新功能。

subprocess.BELOW_NORMAL_PRIORITY_CLASS
一個參數指定一個新的進程將有一個低於平均水平的優先級。Popen creationflags

3.7版中的新功能。

subprocess.HIGH_PRIORITY_CLASS
一個參數,用於指定新進程將具有較高的優先級。Popen creationflags

3.7版中的新功能。

subprocess.IDLE_PRIORITY_CLASS
一個參數,用於指定新進程將具有空閒(最低)優先級。Popen creationflags
3.7版中的新功能。

subprocess.NORMAL_PRIORITY_CLASS
一個參數指定一個新的進程將有一個正常的優先級。(默認)Popen creationflags
3.7版中的新功能。

subprocess.REALTIME_PRIORITY_CLASS
一個參數,用於指定新進程將具有實時優先級。您幾乎永遠不要使用REALTIME_PRIORITY_CLASS,因爲這會中斷管理鼠標輸入,鍵盤輸入和後臺磁盤刷新的系統線程。此類適合於直接與硬件“對話”或執行短暫任務(應具有有限中斷)的應用程序。Popen creationflags
3.7版中的新功能。

subprocess.CREATE_NO_WINDOW
一個參數指定一個新的進程不會創建一個窗口。Popen creationflags
3.7版中的新功能。

subprocess.DETACHED_PROCESS
一個參數,用於指定新進程將不會繼承其父級的控制檯。此值不能與CREATE_NEW_CONSOLE一起使用。Popen creationflags
3.7版中的新功能。

subprocess.CREATE_DEFAULT_ERROR_MODE
一個參數,用於指定新進程不繼承調用進程的錯誤模式。而是,新進程將使用默認錯誤模式。對於禁用了硬錯誤的多線程外殼應用程序,此功能特別有用。Popen creationflags
3.7版中的新功能。

subprocess.CREATE_BREAKAWAY_FROM_JOB
一個參數,用於指定新流程不與作業關聯。Popen creationflags
3.7版中的新功能。

較舊的高級

在Python 3.5之前,這三個函數包含用於子流程的高級API 。您現在可以run()在許多情況下使用,但是許多現有代碼都調用了這些函數。

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

運行args描述的命令。等待命令完成,然後返回returncode屬性。

需要捕獲stdout或stderr的代碼應run()改爲:

運行(...)。返回碼

要抑制stdout或stderr,請提供值DEVNULL。

上面顯示的參數僅僅是一些常見的參數。完整的函數簽名與Popen構造函數的簽名相同-該函數將超時以外的所有提供的參數直接傳遞給該接口。

注意 請勿使用stdout=PIPE或stderr=PIPE與此功能一起使用。如果子進程向管道生成足夠的輸出以填充OS管道緩衝區,則該子進程將阻塞,因爲未從中讀取管道。

在版本3.3中更改:添加了超時。

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

使用參數運行命令。等待命令完成。如果返回碼爲零,則返回,否則返回CalledProcessError。該 CalledProcessError對象將在returncode屬性中包含返回碼 。

需要捕獲stdout或stderr的代碼應run()改爲:
	run(…, check=True)

上面顯示的參數僅僅是一些常見的參數。完整的函數簽名與Popen構造函數的簽名相同-該函數將超時以外的所有提供的參數直接傳遞給該接口。

注意 請勿使用stdout=PIPE或stderr=PIPE與此功能一起使用。如果子進程向管道生成足夠的輸出以填充OS管道緩衝區,則該子進程將阻塞,因爲未從中讀取管道。

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)

運行帶有參數的命令並返回其輸出。
如果返回碼非零,則會引發一個CalledProcessError。該 CalledProcessError對象將在returncode屬性中具有返回碼,在 屬性中具有任何輸出 output。
這等效於:
run(..., check=True, stdout=PIPE).stdout

上面顯示的參數僅僅是一些常見的參數。全功能簽名與run()_ 完全相同-大多數參數直接傳遞給該接口。但是,input=None不支持顯式傳遞以繼承父級的標準輸入文件句柄。

默認情況下,此函數將以編碼字節的形式返回數據。輸出數據的實際編碼可能取決於調用的命令,因此對文本的解碼通常需要在應用程序級別進行處理。

可以通過將text,encoding,errors或universal_newlines設置True爲,如“ 常用參數”和“ run()。

要還捕獲結果中的標準錯誤,請使用 :stderr=subprocess.STDOUT

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'

Replacing Older Functions with the subprocess Module

在本節中,“ a變爲b”表示b可以替代a。
注意 如果找不到執行的程序,則本節中的所有“ a”功能都會(或多或少)無聲地失敗;OSError 取而代之的是“ b”替代詞。
此外,如果所請求的操作產生非零的返回碼,則使用的替換check_output()將失敗,並顯示 CalledProcessError。輸出仍然可用作output引發的異常的 屬性。

在以下示例中,我們假設subprocess相關功能已從模塊中導入。

替換/ bin / sh shell反引號

output=`mycmd myarg`

變成:

output = check_output(["mycmd", "myarg"])

更換外殼管道

output=`dmesg | grep hda`

變成:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

如果p2在p1之前退出,則啓動p2之後的p1.stdout.close()調用很重要,這樣p1才能接收SIGPIPE。

另外,對於受信任的輸入,仍然可以直接使用外殼自身的管道支持:

output=`dmesg | grep hda`

變成:

output=check_output("dmesg | grep hda", shell=True)

替換os.system()

sts = os.system("mycmd" + " myarg")
# becomes
sts = call("mycmd" + " myarg", shell=True)

一個更現實的示例如下所示:

try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print("Child was terminated by signal", -retcode, file=sys.stderr)
    else:
        print("Child returned", retcode, file=sys.stderr)
except OSError as e:
    print("Execution failed:", e, file=sys.stderr)

更換os.spawn
P_NOWAIT示例:

pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid

P_WAIT示例:

retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])

矢量示例:

os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])

環境示例:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})

更換os.popen(),os.popen2(),os.popen3()

(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
(child_stdin,
 child_stdout,
 child_stderr) = os.popen3(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)

返回碼處理翻譯如下:

pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
    print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
    print("There were some errors")

替換popen2模塊中的函數
注意 如果popen2函數的cmd參數是字符串,則通過/ bin / sh執行命令。如果是列表,則直接執行命令。

(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
==>
p = Popen("somestring", shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
==>
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)

popen2.Popen3和popen2.Popen4基本工作原理爲 ,不同的是:subprocess.Popen

Popen 如果執行失敗,將引發異常。

該capturestderr參數被替換爲標準錯誤的說法。

stdin=PIPE並且stdout=PIPE必須指定。

popen2默認情況下會關閉所有文件描述符,但是您必須指定 close_fds=Truewith Popen來保證在所有平臺或過去的Python版本上都具有這種行爲。

舊版Shell調用函數
該模塊還從2.x commands模塊提供以下舊版功能 。這些操作隱式調用系統外殼,並且上述關於安全性和異常處理一致性的保證對於這些功能均無效。

subprocess.getstatusoutput(cmd )
	在shell中返回執行cmd。(exitcode, output)
	在shell中執行字符串cmdPopen.check_output()並返回2元組。使用語言環境編碼;有關更多詳細信息,請參見“ 常用參數”中的註釋。(exitcode, output)
	從輸出中刪除尾隨換行符。該命令的退出代碼可以解釋爲子進程的返回代碼。例:
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '')

可用性:POSIX和Windows。

在版本3.3.4中更改:添加了Windows支持。

該函數現在返回(退出代碼,輸出),而不是像在Python 3.3.3和更早版本中那樣返回(狀態,輸出)。exitcode與的值相同 returncode。

subprocess.getoutput(cmd )

返回在外殼程序中執行cmd的輸出(stdout和stderr)。

與相似getstatusoutput(),除了退出代碼被忽略,返回值是包含命令輸出的字符串。例:
>>> subprocess.getoutput('ls /bin/ls')
	'/bin/ls'

可用性:POSIX和Windows
在版本3.3.4中更改:添加了Windows支持

在Windows上將參數序列轉換爲字符串

在Windows上,將args序列轉換爲可以使用以下規則(與MS C運行時使用的規則相對應)進行解析的字符串:

1.參數由空格分隔,空格可以是空格或製表符。

2.用雙引號引起來的字符串將解釋爲單個參數,而不管其中包含的空格如何。可以將帶引號的字符串嵌入參數中。

3.在雙引號前加反斜槓的解釋爲文字雙引號。

4.反斜槓將按字面意義進行解釋,除非它們緊接在雙引號之前。

5.如果反斜槓緊接在雙引號之前,則每對反斜槓都將解釋爲文字反斜槓。如果反斜槓的數量爲奇數,則最後一個反斜槓將按照規則3中的說明轉義下一個雙引號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章