Execute a child program in a new process. On Unix, the class uses
os.execvp()-like behavior to execute the child program. On Windows,
the class uses the Windows CreateProcess() function. The arguments to
Popen are as follows.
args 应当是一个程序的参数列表或者一个简单的字符串。默认情况下,如果 args 是一个序列,将运行的程序是此序列的第一项。如果 args 是一个字符串,解释是平台相关的,如下所述。有关默认行为的其他差异,见 shell 和 executable 参数。除非另有说明,推荐将 args 作为序列传递。
On Unix, if 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.
注解
shlex.split() can be useful when determining the correct
tokenization for args, especially in complex cases:
>>>import shlex, subprocess
>>>command_line = raw_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 是一个序列,他将通过一个在 Converting an argument sequence to a string on Windows 描述的方式被转换为一个字符串。这是因为底层的 CreateProcess() 只处理字符串。
参数 shell (默认为 False)指定是否使用 shell 执行程序。如果 shell 为 True,更推荐将 args 作为字符串传递而非序列。
On Unix with shell=True, the shell defaults to /bin/sh. If
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 指定了默认 shell。在 Windows 你唯一需要指定 shell=True 的情况是你想要执行内置在 shell 中的命令(例如 dir 或者 copy)。在运行一个批处理文件或者基于控制台的可执行文件时,不需要 shell=True。
警告
Passing shell=True can be a security hazard if combined with
untrusted input. See the warning under 常用参数
for details.
bufsize, if given, has the same meaning as the corresponding argument to the
built-in open() function: 0 means unbuffered, 1 means line
buffered, any other positive value means use a buffer of (approximately) that
size. A negative bufsize means to use the system default, which usually means
fully buffered. The default value for bufsize is 0 (unbuffered).
注解
If you experience performance issues, it is recommended that you try to
enable buffering by setting bufsize to either -1 or a large enough
positive value (such as 4096).
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 Unix, the args name
becomes the display name for the executable in utilities such as
ps. If shell=True, on Unix the executable argument
specifies a replacement shell for the default /bin/sh.
stdin, stdout and stderr specify the executed program’s standard input,
standard output and standard error file handles, respectively. Valid values
are PIPE, an existing file descriptor (a positive integer), an
existing file object, and None. PIPE indicates that a new pipe
to the child should be created. With the default settings of None, no
redirection will occur; the child’s file handles will be inherited from the
parent. Additionally, stderr can be STDOUT, which indicates that
the stderr data from the child process should be captured into the same file
handle as for stdout.
If preexec_fn is set to a callable object, this object will be called in the
child process just before the child is executed. (Unix only)
If close_fds is true, all file descriptors except 0, 1 and
2 will be closed before the child process is executed. (Unix only).
Or, on Windows, if close_fds is true then no handles will be inherited by the
child process. Note that on Windows, you cannot set close_fds to true and
also redirect the standard handles by setting stdin, stdout or stderr.
If cwd is not None, the child’s current directory will be changed to cwd
before it is executed. Note that this directory is not considered when
searching the executable, so you can’t specify the program’s path relative to
cwd.
If env is not None, it must be a mapping that defines the environment
variables for the new process; these are used instead of inheriting the current
process’ environment, which is the default behavior.
注解
如果指定, env 必须提供所有被子进程需求的变量。在 Windows,为了运行一个 side-by-side assembly ,指定的 env 必须 包含一个有效的 SystemRoot。
If universal_newlines is True, the file objects stdout and stderr
are opened as text files in universal newlines mode. Lines may be
terminated by any of '\n', the Unix end-of-line convention, '\r',
the old Macintosh convention or '\r\n', the Windows convention. All of
these external representations are seen as '\n' by the Python program.
注解
This feature is only available if Python is built with universal newline
support (the default). Also, the newlines attribute of the file objects
stdout, stdin and stderr are not updated by the
communicate() method.
If given, startupinfo will be a STARTUPINFO object, which is
passed to the underlying CreateProcess function.
creationflags, if given, can be CREATE_NEW_CONSOLE or
CREATE_NEW_PROCESS_GROUP. (Windows only)