当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python subprocess.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=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1)

在新进程中执行子程序。在 POSIX 上,该类使用类似 os.execvpe() 的行为来执行子程序。在 Windows 上,该类使用 Windows CreateProcess() 函数。 Popen 的参数如下。

args 应该是程序参数序列,或者是单个字符串或 path-like 对象。默认情况下,如果args 是一个序列,则要执行的程序是args 中的第一项。如果args 是字符串,则解释取决于平台,如下所述。请参阅 shellexecutable 参数以了解与默认行为的其他差异。除非另有说明,否则建议将args 作为序列传递。

警告

为了获得最大的可靠性,请为可执行文件使用完全限定的路径。在上搜索不合格的名称PATH, 采用shutil.which().在所有平台上,通过sys.executable是再次启动当前 Python 解释器的推荐方法,并使用-m命令行 格式以启动已安装的模块。

解析 executable 的路径(或 args 的第一项)取决于平台。对于 POSIX,请参阅 os.execvpe() ,并注意在解析或搜索可执行路径时,cwd 会覆盖当前工作目录,而 env 可以覆盖 PATH 环境变量。对于 Windows,请参阅 WinAPI CreateProcesslpApplicationNamelpCommandLine 参数的文档,并注意使用 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 对象如果shellFalse以及在 POSIX 上包含 path-like 对象的序列。

在 3.8 版中更改:args参数接受一个path-like 对象如果shellFalse以及在 Windows 上包含字节和 path-like 对象的序列。

shell 参数(默认为 False )指定是否使用 shell 作为程序来执行。如果 shellTrue ,建议将 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 上。

stdinstdoutstderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPEDEVNULL 、现有文件说明符(正整数)、具有有效文件说明符的现有文件对象和 NonePIPE 表示应该创建一个到子节点的新管道。 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 为真,则除了 012 之外的所有文件说明符都将在子进程执行之前关闭。否则,当close_fds 为假时,文件说明符遵循其可继承标志,如文件说明符的继承中所述。

在 Windows 上,如果 close_fds 为真,则子进程不会继承任何句柄,除非在 STARTUPINFO.lpAttributeListhandle_list 元素中显式传递,或者通过标准句柄重定向。

在 3.2 版中更改:默认为close_fds从改变False到上面说明的。

在 3.7 版中更改:在 Windows 上,默认为close_fds从改变FalseTrue重定向标准句柄时。现在可以设置close_fdsTrue重定向标准句柄时。

pass_fds 是一个可选的文件说明符序列,用于在父子节点之间保持打开状态。提供任何 pass_fds 强制 close_fdsTrue 。 (仅限 POSIX)

在 3.2 版中更改: pass_fds添加了参数。

如果 cwd 不是 None ,则函数在执行子进程之前将工作目录更改为 cwdcwd 可以是字符串、字节或 path-like 对象。在 POSIX 上,如果可执行路径是相对路径,则函数查找相对于 cwdexecutable(或 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.

如果指定了 encodingerrors,或者 text 为真,则文件对象 stdinstdoutstderr 将使用指定的编码和 errors 以文本模式打开,如上文所述常用参数。 universal_newlines 参数等效于 text 并提供向后兼容性。默认情况下,文件对象以二进制模式打开。

3.6 版中的新函数:encodingerrors添加。

3.7 版中的新函数:text被添加为更易读的别名universal_newlines.

如果给定,startupinfo 将是一个 STARTUPINFO 对象,它被传递给底层的 CreateProcess 函数。 creationflags 如果给定,可以是以下一个或多个标志:

PIPE 用于 stdinstdoutstderr 时,pipesize 可用于更改管道的大小。管道的大小仅在支持此函数的平台上更改(在撰写本文时仅 Linux)。其他平台将忽略此参数。

3.10 版中的新函数: pipesize添加了参数。

通过with 语句支持 Popen 对象作为上下文管理器:退出时,标准文件说明符关闭,并等待进程。

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

Popen 和此模块中使用它的其他函数引发审计事件 subprocess.Popen 带有参数 executableargscwdenvargs 的值可能是单个字符串或字符串列表,具体取决于平台。

在 3.2 版中更改:添加了上下文管理器支持。

在 3.6 版中更改:Popen 析构函数现在发出一个ResourceWarning如果子进程仍在运行,则发出警告。

在 3.8 版中更改:Popen 可以使用os.posix_spawn()在某些情况下以获得更好的性能。在 Linux 和 QEMU 用户仿真的 Windows 子系统上,使用 Popen 构造函数os.posix_spawn()不再对缺少程序等错误引发异常,但子进程以非零值失败returncode.

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 subprocess.Popen。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。