在新进程中执行子级程序。在 POSIX (便携式操作系统接口),类使用
os.execvpe()
类似行为来执行子级程序。在 Windows,类使用 Windows
CreateProcess()
函数。自变量到
Popen
如下所示。
args
should be a sequence of program arguments or else a single string or
像路径对象
. By default, the program to execute is the first item in
args
if
args
is a sequence. If
args
is a string, the interpretation is platform-dependent and described below. See the
shell
and
executable
arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass
args
as a sequence.
警告
For maximum reliability, use a fully qualified path for the executable. To search for an unqualified name on
PATH
,使用
shutil.which()
. On all platforms, passing
sys.executable
is the recommended way to launch the current Python interpreter again, and use the
-m
command-line format to launch an installed module.
Resolving the path of
executable
(or the first item of
args
) is platform dependent. For POSIX, see
os.execvpe()
, and note that when resolving or searching for the executable path,
cwd
overrides the current working directory and
env
can override the
PATH
environment variable. For Windows, see the documentation of the
lpApplicationName
and
lpCommandLine
parameters of WinAPI
CreateProcess
, and note that when resolving or searching for the executable path with
shell=False
,
cwd
does not override the current working directory and
env
cannot override the
PATH
environment variable. Using a full path avoids all of these variations.
An example of passing some arguments to an external program as a sequence is:
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
在 POSIX (便携式操作系统接口),若
args
is a string, the string is interpreted as the name or path of the program to execute. However, this can only be done if not passing arguments to the program.
注意
It may not be obvious how to break a shell command into a sequence of arguments, especially in complex cases.
shlex.split()
can illustrate how to determine the correct tokenization for
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!
Note in particular that options (such as
-input
) and arguments (such as
eggs.txt
) that are separated by whitespace in the shell go in separate list elements, while arguments that need quoting or backslash escaping when used in the shell (such as filenames containing spaces or the
echo
command shown above) are single list elements.
在 Windows,若
args
is a sequence, it will be converted to a string in a manner described in
在 Windows 将自变量序列转换成字符串
. This is because the underlying
CreateProcess()
operates on strings.
3.6 版改变:
args
参数接受
像路径对象
if
shell
is
False
and a sequence containing path-like objects on POSIX.
3.8 版改变:
args
参数接受
像路径对象
if
shell
is
False
and a sequence containing bytes and path-like objects on Windows.
The
shell
自变量 (默认为
False
) specifies whether to use the shell as the program to execute. If
shell
is
True
, it is recommended to pass
args
as a string rather than as a sequence.
在 POSIX (便携式操作系统接口) 采用
shell=True
, the shell defaults to
/bin/sh
。若
args
is a string, the string specifies the command to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt. This includes, for example, quoting or backslash escaping filenames with spaces in them. If
args
is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself. That is to say,
Popen
does the equivalent of:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
在 Windows 采用
shell=True
,
COMSPEC
environment variable specifies the default shell. The only time you need to specify
shell=True
on Windows is when the command you wish to execute is built into the shell (e.g.
dir
or
copy
). You do not need
shell=True
to run a batch file or console-based executable.
注意
阅读
安全注意事项
章节先于使用
shell=True
.
bufsize
will be supplied as the corresponding argument to the
open()
function when creating the stdin/stdout/stderr pipe file objects:
-
0
means unbuffered (read and write are one system call and can return short)
-
1
means line buffered (only usable if
text=True
or
universal_newlines=True
)
-
any other positive value means use a buffer of approximately that size
-
negative bufsize (the default) means the system default of io.DEFAULT_BUFFER_SIZE will be used.
Changed in version 3.3.1:
bufsize
now defaults to -1 to enable buffering by default to match the behavior that most code expects. In versions prior to Python 3.2.4 and 3.3.1 it incorrectly defaulted to
0
which was unbuffered and allowed short reads. This was unintentional and did not match the behavior of Python 2 as most code expected.
The
executable
argument specifies a replacement program to execute. It is very seldom needed. When
shell=False
,
executable
replaces the program to execute specified by
args
. However, the original
args
is still passed to the program. Most programs treat the program specified by
args
as the command name, which can then be different from the program actually executed. On POSIX, the
args
name becomes the display name for the executable in utilities such as
ps
。若
shell=True
, on POSIX the
executable
argument specifies a replacement shell for the default
/bin/sh
.
3.6 版改变:
executable
参数接受
像路径对象
on POSIX.
3.8 版改变:
executable
parameter accepts a bytes and
像路径对象
在 Windows。
3.12 版改变:
Changed Windows shell search order for
shell=True
. The current directory and
%PATH%
are replaced with
%COMSPEC%
and
%SystemRoot%\System32\cmd.exe
. As a result, dropping a malicious program named
cmd.exe
into a current directory no longer works.
stdin
,
stdout
and
stderr
specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are
None
,
PIPE
,
DEVNULL
, an existing file descriptor (a positive integer), and an existing
文件对象
with a valid file descriptor. With the default settings of
None
, no redirection will occur.
PIPE
indicates that a new pipe to the child should be created.
DEVNULL
indicates that the special file
os.devnull
will be used. Additionally,
stderr
可以是
STDOUT
, which indicates that the stderr data from the applications should be captured into the same file handle as for
stdout
.
若
preexec_fn
is set to a callable object, this object will be called in the child process just before the child is executed. (POSIX only)
警告
The
preexec_fn
parameter is NOT SAFE to use in the presence of threads in your application. The child process could deadlock before exec is called.
注意
若需要为子级修改环境使用
env
参数而不是处理它在
preexec_fn
。
start_new_session
and
process_group
parameters should take the place of code using
preexec_fn
to call
os.setsid()
or
os.setpgid()
in the child.
3.8 版改变:
The
preexec_fn
parameter is no longer supported in subinterpreters. The use of the parameter in a subinterpreter raises
RuntimeError
. The new restriction may affect applications that are deployed in mod_wsgi, uWSGI, and other embedded environments.
若
close_fds
is true, all file descriptors except
0
,
1
and
2
will be closed before the child process is executed. Otherwise when
close_fds
is false, file descriptors obey their inheritable flag as described in
文件描述符的继承
.
在 Windows,若
close_fds
is true then no handles will be inherited by the child process unless explicitly passed in the
handle_list
元素的
STARTUPINFO.lpAttributeList
, or by standard handle redirection.
3.2 版改变:
默认为
close_fds
was changed from
False
to what is described above.
3.7 版改变:
On Windows the default for
close_fds
was changed from
False
to
True
when redirecting the standard handles. It’s now possible to set
close_fds
to
True
when redirecting the standard handles.
pass_fds
is an optional sequence of file descriptors to keep open between the parent and child. Providing any
pass_fds
forces
close_fds
到
True
. (POSIX only)
3.2 版改变:
The
pass_fds
参数被添加。
若
cwd
不是
None
, the function changes the working directory to
cwd
before executing the child.
cwd
can be a string, bytes or
像路径
object. On POSIX, the function looks for
executable
(or for the first item in
args
) relative to
cwd
if the executable path is a relative path.
3.6 版改变:
cwd
参数接受
像路径对象
on POSIX.
3.7 版改变:
cwd
参数接受
像路径对象
在 Windows。
3.8 版改变:
cwd
parameter accepts a bytes object on Windows.
若
restore_signals
is true (the default) all signals that Python has set to SIG_IGN are restored to SIG_DFL in the child process before the exec. Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals. (POSIX only)
3.2 版改变:
restore_signals
被添加。
若
start_new_session
为 True
setsid()
system call will be made in the child process prior to the execution of the subprocess.
可用性
: POSIX
3.2 版改变:
start_new_session
被添加。
若
process_group
is a non-negative integer, the
setpgid(0, value)
system call will be made in the child process prior to the execution of the subprocess.
可用性
: POSIX
3.11 版改变:
process_group
被添加。
若
group
不是
None
, the setregid() system call will be made in the child process prior to the execution of the subprocess. If the provided value is a string, it will be looked up via
grp.getgrnam()
and the value in
gr_gid
will be used. If the value is an integer, it will be passed verbatim. (POSIX only)
可用性
: POSIX
Added in version 3.9.
若
extra_groups
不是
None
, the setgroups() system call will be made in the child process prior to the execution of the subprocess. Strings provided in
extra_groups
will be looked up via
grp.getgrnam()
and the values in
gr_gid
will be used. Integer values will be passed verbatim. (POSIX only)
可用性
: POSIX
Added in version 3.9.
若
user
不是
None
, the setreuid() system call will be made in the child process prior to the execution of the subprocess. If the provided value is a string, it will be looked up via
pwd.getpwnam()
and the value in
pw_uid
will be used. If the value is an integer, it will be passed verbatim. (POSIX only)
可用性
: POSIX
Added in version 3.9.
若
umask
is not negative, the umask() system call will be made in the child process prior to the execution of the subprocess.
可用性
: POSIX
Added in version 3.9.
若
env
不是
None
, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process’ environment. This mapping can be str to str on any platform or bytes to bytes on POSIX platforms much like
os.environ
or
os.environb
.
注意
若指定,
env
必须提供要执行程序要求的任何变量。在 Windows,为运行
并行汇编
指定
env
must
包括有效
SystemRoot
.
若
encoding
or
errors
被指定,或
text
is true, the file objects
stdin
,
stdout
and
stderr
are opened in text mode with the specified
encoding
and
errors
, as described above in
经常使用的自变量
。
universal_newlines
argument is equivalent to
text
and is provided for backwards compatibility. By default, file objects are opened in binary mode.
Added in version 3.6:
encoding
and
errors
被添加。
Added in version 3.7:
text
被添加作为更可读的别名化
universal_newlines
.
若给定,
startupinfo
将是
STARTUPINFO
对象,会被传递给底层
CreateProcess
函数。
若给定,
creationflags
, can be one or more of the following flags:
pipesize
can be used to change the size of the pipe when
PIPE
is used for
stdin
,
stdout
or
stderr
. The size of the pipe is only changed on platforms that support this (only Linux at this time of writing). Other platforms will ignore this parameter.
3.10 版改变:
添加
pipesize
参数。
Popen objects are supported as context managers via the
with
statement: on exit, standard file descriptors are closed, and the process is waited for.
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
warning if the child process is still running.
3.8 版改变:
Popen 可以使用
os.posix_spawn()
in some cases for better performance. On Windows Subsystem for Linux and QEMU User Emulation, Popen constructor using
os.posix_spawn()
no longer raise an exception on errors like missing program, but the child process fails with a non-zero
returncode
.
异常
¶
在子级进程中引发的异常会在父级中重新引发,在开始执行新程序之前。
最常引发的异常是
OSError
. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for
OSError
exceptions. Note that, when
shell=True
,
OSError
will be raised by the child only if the selected shell itself was not found. To determine if the shell failed to find the requested application, it is necessary to check the return code or output from the subprocess.
A
ValueError
会被引发若
Popen
is called with invalid arguments.
check_call()
and
check_output()
会引发
CalledProcessError
if the called process returns a non-zero return code.
All of the functions and methods that accept a
timeout
parameter, such as
run()
and
Popen.communicate()
会引发
TimeoutExpired
if the timeout expires before the process exits.
此模块中定义的异常都继承自
SubprocessError
.
Added in version 3.3:
The
SubprocessError
基类被添加。
安全注意事项
¶
Unlike some other popen functions, this library will not implicitly choose to call a system shell. This means that all characters, including shell metacharacters, can safely be passed to child processes. If the shell is invoked explicitly, via
shell=True
, it is the application’s responsibility to ensure that all whitespace and metacharacters are quoted appropriately to avoid
shell injection
vulnerabilities. On
some platforms
, it is possible to use
shlex.quote()
for this escaping.
On Windows, batch files (
*.bat
or
*.cmd
) may be launched by the operating system in a system shell regardless of the arguments passed to this library. This could result in arguments being parsed according to shell rules, but without any escaping added by Python. If you are intentionally launching a batch file with arguments from untrusted sources, consider passing
shell=True
to allow Python to escape special characters. See
gh-114539
for additional discussion.
Popen 对象
¶
实例化的
Popen
类具有下列方法:
-
Popen.
poll
(
)
¶
-
校验子级进程是否已终止。设置并返回
returncode
属性。否则,返回
None
.
-
Popen.
wait
(
timeout
=
None
)
¶
-
等待子级进程终止。设置并返回
returncode
属性。
若进程未终止后于
timeout
秒,引发
TimeoutExpired
异常。捕获此异常并试着等待是安全的。
注意
这会死锁,当使用
stdout=PIPE
or
stderr=PIPE
子级进程生成足够输出到管道,这会阻塞等待的 OS 管道缓冲以接受更多数据。使用
Popen.communicate()
当使用管道时能避免这种情况。
注意
当
timeout
parameter is not
None
, then (on POSIX) the function is implemented using a busy loop (non-blocking call and short sleeps). Use the
asyncio
模块对于异步等待:见
asyncio.create_subprocess_exec
.
3.3 版改变:
timeout
被添加。
-
Popen.
communicate
(
input
=
None
,
timeout
=
None
)
¶
-
与进程交互:把数据发送给 stdin。从 stdout 和 stderr 读取数据,直到到达 EOF (文件末尾)。等待进程终止并设置
returncode
属性。可选
input
参数应该是要发送给子级进程的数据,或为
None
若不应该向子级发送数据。若以文本模式打开流,
input
必须是字符串。否则,必须是字节。
communicate()
返回元组
(stdout_data, stderr_data)
。数据将是字符串,若以文本模式打开流;否则,是字节。
注意,若想要把数据发送给进程的 stdin,需要创建 Popen 对象采用
stdin=PIPE
。同样,要获取任何东西除了
None
在结果元组,需要给出
stdout=PIPE
and/or
stderr=PIPE
也。
若进程未终止后于
timeout
秒,
TimeoutExpired
异常会被引发。捕获此异常并试着通信不会丢失任何输出。
不杀除子级进程若超时到期,所以为正确清理行为良好的应用程序,应杀除子级进程并完成通信:
proc = subprocess.Popen(...)
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
注意
读取数据缓冲在内存中,所以不要使用此方法若数据尺寸很大 (或不受限制)。
3.3 版改变:
timeout
被添加。
-
Popen.
send_signal
(
signal
)
¶
-
发送信号
signal
到子级。
什么都不做,若进程完成。
注意
在 Windows,SIGTERM 是别名化的
terminate()
。可以将 CTRL_C_EVENT 和 CTRL_BREAK_EVENT 发送给进程,启动时采用
creationflags
参数包括
CREATE_NEW_PROCESS_GROUP
.
-
Popen.
terminate
(
)
¶
-
Stop the child. On POSIX OSs the method sends
SIGTERM
to the child. On Windows the Win32 API function
TerminateProcess()
被调用以停止子级。
-
Popen.
kill
(
)
¶
-
杀除子级。在 POSIX (便携式操作系统接口) OS,函数将 SIGKILL 发送给子级。在 Windows
kill()
是别名化的
terminate()
.
The following attributes are also set by the class for you to access. Reassigning them to new values is unsupported:
-
Popen.
args
¶
-
The
args
自变量是被传递给
Popen
– 程序自变量 (或单个字符串) 的序列。
Added in version 3.3.
-
Popen.
stdin
¶
-
若
stdin
自变量为
PIPE
,此属性是可写流对象返回通过
open()
。若
encoding
or
errors
自变量有指定或
text
or
universal_newlines
自变量为
True
,流是文本流,否则流是字节流。若
stdin
自变量不是
PIPE
,此属性为
None
.
-
Popen.
stdout
¶
-
若
stdout
自变量为
PIPE
,此属性是可读流对象返回通过
open()
。从流读取提供来自子级进程的输出。若
encoding
or
errors
自变量有指定或
text
or
universal_newlines
自变量为
True
,流是文本流,否则流是字节流。若
stdout
自变量不是
PIPE
,此属性为
None
.
-
Popen.
stderr
¶
-
若
stderr
自变量为
PIPE
,此属性是可读流对象返回通过
open()
。从流读取提供来自子级进程的错误输出。若
encoding
or
errors
自变量有指定或
text
or
universal_newlines
自变量为
True
,流是文本流,否则流是字节流。若
stderr
自变量不是
PIPE
,此属性为
None
.
-
Popen.
pid
¶
-
子级进程的进程 ID。
注意:若设置
shell
自变量对于
True
,这是卵生 Shell 的进程 ID。
-
Popen.
returncode
¶
-
The child return code. Initially
None
,
returncode
is set by a call to the
poll()
,
wait()
,或
communicate()
methods if they detect that the process has terminated.
A
None
value indicates that the process hadn’t yet terminated at the time of the last method call.
负值
-N
指示子级被终止,通过信号
N
(仅 POSIX)。
Windows Popen 帮手
¶
The
STARTUPINFO
类和以下常量只可用于 Windows。
-
class
subprocess.
STARTUPINFO
(
*
,
dwFlags
=
0
,
hStdInput
=
None
,
hStdOutput
=
None
,
hStdError
=
None
,
wShowWindow
=
0
,
lpAttributeList
=
None
)
¶
-
部分支持 Windows
STARTUPINFO
结构用于
Popen
创建。通过作为仅关键字自变量传递,可以设置下列属性。
3.7 版改变:
添加仅关键字自变量支持。
-
dwFlags
¶
A bit field that determines whether certain
STARTUPINFO
attributes are used when the process creates a window.
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW