用法:
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
