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