用法:
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 上,args
name 成為實用程序中可執行文件的顯示名稱,例如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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。