用法:
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=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1)在新進程中執行子程序。在 POSIX 上,該類使用類似
os.execvpe()的行為來執行子程序。在 Windows 上,該類使用 WindowsCreateProcess()函數。Popen的參數如下。args應該是程序參數序列,或者是單個字符串或 path-like 對象。默認情況下,如果args是一個序列,則要執行的程序是args中的第一項。如果args是字符串,則解釋取決於平台,如下所述。請參閱shell和executable參數以了解與默認行為的其他差異。除非另有說明,否則建議將args作為序列傳遞。警告
為了獲得最大的可靠性,請為可執行文件使用完全限定的路徑。在上搜索不合格的名稱
PATH, 采用shutil.which().在所有平台上,通過sys.executable是再次啟動當前 Python 解釋器的推薦方法,並使用-m命令行 格式以啟動已安裝的模塊。解析
executable的路徑(或args的第一項)取決於平台。對於 POSIX,請參閱os.execvpe(),並注意在解析或搜索可執行路徑時,cwd會覆蓋當前工作目錄,而env可以覆蓋PATH環境變量。對於 Windows,請參閱 WinAPICreateProcess的lpApplicationName和lpCommandLine參數的文檔,並注意使用shell=False解析或搜索可執行路徑時,cwd不會覆蓋當前工作目錄並且env不能覆蓋PATH環境變量。使用完整路徑可以避免所有這些變化。將一些參數作為序列傳遞給外部程序的示例是:
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])在 POSIX 上,如果
args是字符串,則該字符串被解釋為要執行的程序的名稱或路徑。但是,隻有在不向程序傳遞參數的情況下才能做到這一點。注意
如何將 shell 命令分解為一係列參數可能並不明顯,尤其是在複雜情況下。
shlex.split()可以說明如何確定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!請特別注意,shell 中由空格分隔的選項(例如
-input)和參數(例如eggs.txt)位於單獨的列表元素中,而在 shell 中使用時需要引用或反斜杠轉義的參數(例如因為包含空格的文件名或上麵顯示的echo命令)是單個列表元素。在 Windows 上,如果
args是一個序列,它將按照在 Windows 上將參數序列轉換為字符串中所述的方式轉換為字符串。這是因為底層的CreateProcess()對字符串進行操作。在 3.6 版中更改:
args參數接受一個path-like 對象如果shell是False以及在 POSIX 上包含 path-like 對象的序列。在 3.8 版中更改:
args參數接受一個path-like 對象如果shell是False以及在 Windows 上包含字節和 path-like 對象的序列。shell參數(默認為False)指定是否使用 shell 作為程序來執行。如果shell是True,建議將args作為字符串而不是序列傳遞。在帶有
shell=True的 POSIX 上,shell 默認為/bin/sh。如果args是字符串,則該字符串指定要通過shell 執行的命令。這意味著字符串的格式必須與在 shell 提示符下鍵入時的格式完全相同。這包括,例如,引用或反斜杠轉義文件名,其中包含空格。如果args是一個序列,則第一項指定命令字符串,任何附加項都將被視為 shell 本身的附加參數。也就是說,Popen相當於:Popen(['/bin/sh', '-c', args[0], args[1], ...])在 Windows 上
shell=True, 這COMSPEC環境變量指定默認 shell 。唯一需要指定的時間shell=True在 Windows 上是當您希望執行的命令被內置到 shell 中時(例如目錄或者複製)。你不需要shell=True運行批處理文件或基於控製台的可執行文件。注意
在使用
shell=True之前閱讀 Security Considerations 部分。在創建 stdin/stdout/stderr 管道文件對象時,
bufsize將作為open()函數的相應參數提供: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 的行為不匹配。executable參數指定要執行的替換程序。很少需要它。什麽時候shell=False,executable替換由指定的要執行的程序args.然而,原args仍然傳遞給程序。大多數程序處理由指定的程序args作為命令名稱,它可能與實際執行的程序不同。在 POSIX 上,argsname 成為實用程序中可執行文件的顯示名稱,例如ps.如果shell=True, 在 POSIX 上executable參數指定默認的替換 shell/bin/sh.在 3.6 版中更改:
executable參數接受一個path-like 對象在 POSIX 上。在 3.8 版中更改:
executable參數接受一個字節和path-like 對象在 Windows 上。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()。在 3.8 版中更改:
preexec_fn子解釋器不再支持參數。在子解釋器中使用參數會引發RuntimeError.新限製可能會影響部署在mod_wsgi、uWSGI 和其他嵌入式環境中的應用程序。如果
close_fds為真,則除了0、1和2之外的所有文件說明符都將在子進程執行之前關閉。否則,當close_fds為假時,文件說明符遵循其可繼承標誌,如文件說明符的繼承中所述。在 Windows 上,如果
close_fds為真,則子進程不會繼承任何句柄,除非在STARTUPINFO.lpAttributeList的handle_list元素中顯式傳遞,或者通過標準句柄重定向。在 3.2 版中更改:默認為
close_fds從改變False到上麵說明的。pass_fds是一個可選的文件說明符序列,用於在父子節點之間保持打開狀態。提供任何pass_fds強製close_fds為True。 (僅限 POSIX)在 3.2 版中更改:
pass_fds添加了參數。如果
cwd不是None,則函數在執行子進程之前將工作目錄更改為cwd。cwd可以是字符串、字節或 path-like 對象。在 POSIX 上,如果可執行路徑是相對路徑,則函數查找相對於cwd的executable(或args中的第一項)。在 3.6 版中更改:
cwd參數接受一個path-like 對象在 POSIX 上。在 3.7 版中更改:
cwd參數接受一個path-like 對象在 Windows 上。在 3.8 版中更改:
cwd參數在 Windows 上接受字節對象。如果
restore_signals為真(默認值),Python 設置為 SIG_IGN 的所有信號都將在 exec 之前的子進程中恢複為 SIG_DFL。目前這包括 SIGPIPE、SIGXFZ 和 SIGXFSZ 信號。 (僅限 POSIX)在 3.2 版中更改:
restore_signals加入。如果
start_new_session為真,setsid() 係統調用將在子進程執行之前在子進程中進行。 (僅限 POSIX)在 3.2 版中更改:
start_new_session加入。如果
group不是None,則 setregid() 係統調用將在子進程執行之前在子進程中進行。如果提供的值是一個字符串,它將通過grp.getgrnam()查找並使用gr_gid中的值。如果該值是整數,則將逐字傳遞。 (僅限 POSIX)可用性:POSIX
3.9 版中的新函數。
如果
extra_groups不是None,則 setgroups() 係統調用將在子進程執行之前在子進程中進行。extra_groups中提供的字符串將通過grp.getgrnam()查找,並使用gr_gid中的值。整數值將逐字傳遞。 (僅限 POSIX)可用性:POSIX
3.9 版中的新函數。
如果
user不是None,則 setreuid() 係統調用將在子進程執行之前在子進程中進行。如果提供的值是一個字符串,它將通過pwd.getpwnam()查找並使用pw_uid中的值。如果該值是整數,則將逐字傳遞。 (僅限 POSIX)可用性:POSIX
3.9 版中的新函數。
如果
umask不為負,則在子進程執行之前,將在子進程中進行umask() 係統調用。可用性:POSIX
3.9 版中的新函數。
如果
env不是None,則必須是為新進程定義環境變量的映射;這些用於代替繼承當前進程環境的默認行為。注意
如果指定,
env必須提供程序執行所需的任何變量。在 Windows 上,為了運行side-by-side 組裝指定的env必須包括一個有效的SystemRoot.如果指定了
encoding或errors,或者text為真,則文件對象stdin、stdout和stderr將使用指定的編碼和errors以文本模式打開,如上文所述常用參數。universal_newlines參數等效於text並提供向後兼容性。默認情況下,文件對象以二進製模式打開。3.6 版中的新函數:
encoding和errors添加。3.7 版中的新函數:
text被添加為更易讀的別名universal_newlines.如果給定,
startupinfo將是一個STARTUPINFO對象,它被傳遞給底層的CreateProcess函數。creationflags如果給定,可以是以下一個或多個標誌:當
PIPE用於stdin、stdout或stderr時,pipesize可用於更改管道的大小。管道的大小僅在支持此函數的平台上更改(在撰寫本文時僅 Linux)。其他平台將忽略此參數。3.10 版中的新函數:
pipesize添加了參數。通過
with語句支持 Popen 對象作為上下文管理器:退出時,標準文件說明符關閉,並等待進程。with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())Popen 和此模塊中使用它的其他函數引發審計事件
subprocess.Popen帶有參數executable、args、cwd和env。args的值可能是單個字符串或字符串列表,具體取決於平台。在 3.2 版中更改:添加了上下文管理器支持。
在 3.6 版中更改:Popen 析構函數現在發出一個
ResourceWarning如果子進程仍在運行,則發出警告。在 3.8 版中更改:Popen 可以使用
os.posix_spawn()在某些情況下以獲得更好的性能。在 Linux 和 QEMU 用戶仿真的 Windows 子係統上,使用 Popen 構造函數os.posix_spawn()不再對缺少程序等錯誤引發異常,但子進程以非零值失敗returncode.
相關用法
- Python subprocess.Popen.communicate用法及代碼示例
- Python subprocess.run用法及代碼示例
- Python subprocess.check_output用法及代碼示例
- Python subprocess.getstatusoutput用法及代碼示例
- Python super()用法及代碼示例
- Python sum()用法及代碼示例
- Python super用法及代碼示例
- Python sklearn.cluster.MiniBatchKMeans用法及代碼示例
- Python scipy.ndimage.binary_opening用法及代碼示例
- Python scipy.signal.windows.tukey用法及代碼示例
- Python scipy.stats.mood用法及代碼示例
- Python str.isidentifier用法及代碼示例
- Python sklearn.metrics.fbeta_score用法及代碼示例
- Python scipy.fft.ihfftn用法及代碼示例
- Python scipy.stats.normaltest用法及代碼示例
- Python scipy.ndimage.convolve1d用法及代碼示例
- Python scipy.stats.arcsine用法及代碼示例
- Python scipy.interpolate.UnivariateSpline.antiderivative用法及代碼示例
- Python scipy.linalg.hadamard用法及代碼示例
- Python socket.create_server用法及代碼示例
注:本文由純淨天空篩選整理自python.org大神的英文原創作品 subprocess.Popen。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
