annotate Lib/subprocess.py @ 49955:878d40468c4e legacy-trunk

Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
author Vinay Sajip <vinay_sajip@yahoo.co.uk>
date Wed, 03 Dec 2008 23:22:58 +0000
parents 6416e6044a30
children 15d8b2db2be4 4790b31d9257
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1 # subprocess - Subprocesses with accessible I/O streams
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2 #
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
3 # For more information about this module, see PEP 324.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
4 #
34624
5fde17b35472 Made the module compatible with Python 2.2 again.
Peter Astrand <astrand@lysator.liu.se>
parents: 34587
diff changeset
5 # This module should remain compatible with Python 2.2, see PEP 291.
5fde17b35472 Made the module compatible with Python 2.2 again.
Peter Astrand <astrand@lysator.liu.se>
parents: 34587
diff changeset
6 #
35633
45aaa436b945 Changed license header: Now simply referring to PSF. This closes bug
Peter Astrand <astrand@lysator.liu.se>
parents: 34818
diff changeset
7 # Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
8 #
34587
e9ec2ce340fd Added copyright notice:
Peter Astrand <astrand@lysator.liu.se>
parents: 34575
diff changeset
9 # Licensed to PSF under a Contributor Agreement.
35633
45aaa436b945 Changed license header: Now simply referring to PSF. This closes bug
Peter Astrand <astrand@lysator.liu.se>
parents: 34818
diff changeset
10 # See http://www.python.org/2.4/license for licensing details.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
11
33776
c5d951a0e0c3 Fix docstring formatting of escape sequences.
Raymond Hettinger <python@rcn.com>
parents: 33770
diff changeset
12 r"""subprocess - Subprocesses with accessible I/O streams
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
13
33770
c6aac03474c5 return codes are available on all platforms, not just on Unix
Fredrik Lundh <fredrik@pythonware.com>
parents: 33751
diff changeset
14 This module allows you to spawn processes, connect to their
c6aac03474c5 return codes are available on all platforms, not just on Unix
Fredrik Lundh <fredrik@pythonware.com>
parents: 33751
diff changeset
15 input/output/error pipes, and obtain their return codes. This module
c6aac03474c5 return codes are available on all platforms, not just on Unix
Fredrik Lundh <fredrik@pythonware.com>
parents: 33751
diff changeset
16 intends to replace several other, older modules and functions, like:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18 os.system
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19 os.spawn*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
20 os.popen*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21 popen2.*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22 commands.*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
23
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
24 Information about how the subprocess module can be used to replace these
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25 modules and functions can be found below.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
28
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
29 Using the subprocess module
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
30 ===========================
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
31 This module defines one class called Popen:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
32
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
33 class Popen(args, bufsize=0, executable=None,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
34 stdin=None, stdout=None, stderr=None,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
35 preexec_fn=None, close_fds=False, shell=False,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
36 cwd=None, env=None, universal_newlines=False,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
37 startupinfo=None, creationflags=0):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
38
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
39
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
40 Arguments are:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
41
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
42 args should be a string, or a sequence of program arguments. The
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
43 program to execute is normally the first item in the args sequence or
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
44 string, but can be explicitly set by using the executable argument.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
45
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
46 On UNIX, with shell=False (default): In this case, the Popen class
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
47 uses os.execvp() to execute the child program. args should normally
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
48 be a sequence. A string will be treated as a sequence with the string
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
49 as the only item (the program to execute).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
50
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
51 On UNIX, with shell=True: If args is a string, it specifies the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
52 command string to execute through the shell. If args is a sequence,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
53 the first item specifies the command string, and any additional items
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
54 will be treated as additional shell arguments.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
55
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
56 On Windows: the Popen class uses CreateProcess() to execute the child
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
57 program, which operates on strings. If args is a sequence, it will be
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
58 converted to a string using the list2cmdline method. Please note that
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
59 not all MS Windows applications interpret the command line the same
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
60 way: The list2cmdline is designed for applications using the same
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
61 rules as the MS C runtime.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
62
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
63 bufsize, if given, has the same meaning as the corresponding argument
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
64 to the built-in open() function: 0 means unbuffered, 1 means line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65 buffered, any other positive value means use a buffer of
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
66 (approximately) that size. A negative bufsize means to use the system
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
67 default, which usually means fully buffered. The default value for
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
68 bufsize is 0 (unbuffered).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
69
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
70 stdin, stdout and stderr specify the executed programs' standard
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
71 input, standard output and standard error file handles, respectively.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
72 Valid values are PIPE, an existing file descriptor (a positive
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
73 integer), an existing file object, and None. PIPE indicates that a
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
74 new pipe to the child should be created. With None, no redirection
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75 will occur; the child's file handles will be inherited from the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
76 parent. Additionally, stderr can be STDOUT, which indicates that the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
77 stderr data from the applications should be captured into the same
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
78 file handle as for stdout.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
79
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
80 If preexec_fn is set to a callable object, this object will be called
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
81 in the child process just before the child is executed.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
83 If close_fds is true, all file descriptors except 0, 1 and 2 will be
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
84 closed before the child process is executed.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
85
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
86 if shell is true, the specified command will be executed through the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
87 shell.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
88
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
89 If cwd is not None, the current directory will be changed to cwd
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90 before the child is executed.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
91
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
92 If env is not None, it defines the environment variables for the new
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
93 process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
94
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
95 If universal_newlines is true, the file objects stdout and stderr are
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
96 opened as a text files, but lines may be terminated by any of '\n',
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
97 the Unix end-of-line convention, '\r', the Macintosh convention or
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
98 '\r\n', the Windows convention. All of these external representations
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
99 are seen as '\n' by the Python program. Note: This feature is only
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
100 available if Python is built with universal newline support (the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
101 default). Also, the newlines attribute of the file objects stdout,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
102 stdin and stderr are not updated by the communicate() method.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
103
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
104 The startupinfo and creationflags, if given, will be passed to the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
105 underlying CreateProcess() function. They can specify things such as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106 appearance of the main window and priority for the new process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
107 (Windows only)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
108
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
109
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
110 This module also defines two shortcut functions:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
111
34111
73b09c2b788b Changed signature of call function to avoid confusion: this 'args' is not the same as the one to the Popen constructor
Peter Astrand <astrand@lysator.liu.se>
parents: 34052
diff changeset
112 call(*popenargs, **kwargs):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
113 Run command with arguments. Wait for command to complete, then
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
114 return the returncode attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
115
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
116 The arguments are the same as for the Popen constructor. Example:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
117
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
118 retcode = call(["ls", "-l"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
119
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
120 check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
121 Run command with arguments. Wait for command to complete. If the
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
122 exit code was zero then return, otherwise raise
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
123 CalledProcessError. The CalledProcessError object will have the
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
124 return code in the returncode attribute.
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
125
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
126 The arguments are the same as for the Popen constructor. Example:
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
127
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
128 check_call(["ls", "-l"])
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
129
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
130 Exceptions
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
131 ----------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
132 Exceptions raised in the child process, before the new program has
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
133 started to execute, will be re-raised in the parent. Additionally,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
134 the exception object will have one extra attribute called
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
135 'child_traceback', which is a string containing traceback information
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
136 from the childs point of view.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
137
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
138 The most common exception raised is OSError. This occurs, for
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
139 example, when trying to execute a non-existent file. Applications
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
140 should prepare for OSErrors.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
141
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
142 A ValueError will be raised if Popen is called with invalid arguments.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
143
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
144 check_call() will raise CalledProcessError, if the called process
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
145 returns a non-zero return code.
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
146
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
147
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
148 Security
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
149 --------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
150 Unlike some other popen functions, this implementation will never call
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
151 /bin/sh implicitly. This means that all characters, including shell
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
152 metacharacters, can safely be passed to child processes.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
153
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
154
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
155 Popen objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
156 =============
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
157 Instances of the Popen class have the following methods:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
158
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
159 poll()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
160 Check if child process has terminated. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
161 attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
162
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
163 wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
164 Wait for child process to terminate. Returns returncode attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
165
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
166 communicate(input=None)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
167 Interact with process: Send data to stdin. Read data from stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
168 and stderr, until end-of-file is reached. Wait for process to
40532
a3222075f5c6 SF bug #1623890, fix argument name in docstring
Neal Norwitz <nnorwitz@gmail.com>
parents: 40244
diff changeset
169 terminate. The optional input argument should be a string to be
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
170 sent to the child process, or None, if no data should be sent to
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
171 the child.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
172
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
173 communicate() returns a tuple (stdout, stderr).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
174
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
175 Note: The data read is buffered in memory, so do not use this
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
176 method if the data size is large or unlimited.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
177
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
178 The following attributes are also available:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
179
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
180 stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
181 If the stdin argument is PIPE, this attribute is a file object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
182 that provides input to the child process. Otherwise, it is None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
183
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
184 stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
185 If the stdout argument is PIPE, this attribute is a file object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
186 that provides output from the child process. Otherwise, it is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
187 None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
188
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
189 stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
190 If the stderr argument is PIPE, this attribute is file object that
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
191 provides error output from the child process. Otherwise, it is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
192 None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
193
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
194 pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
195 The process ID of the child process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
196
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
197 returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
198 The child return code. A None value indicates that the process
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
199 hasn't terminated yet. A negative value -N indicates that the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
200 child was terminated by signal N (UNIX only).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
201
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
202
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
203 Replacing older functions with the subprocess module
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
204 ====================================================
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
205 In this section, "a ==> b" means that b can be used as a replacement
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
206 for a.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
207
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
208 Note: All functions in this section fail (more or less) silently if
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
209 the executed program cannot be found; this module raises an OSError
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 exception.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
211
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
212 In the following examples, we assume that the subprocess module is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213 imported with "from subprocess import *".
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
215
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
216 Replacing /bin/sh shell backquote
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217 ---------------------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
218 output=`mycmd myarg`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
219 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
220 output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
221
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
222
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
223 Replacing shell pipe line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
224 -------------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
225 output=`dmesg | grep hda`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
226 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
227 p1 = Popen(["dmesg"], stdout=PIPE)
34050
fd1be494c31b Corrected example for replacing shell pipeline. Fixes bug 1073790.
Peter Astrand <astrand@lysator.liu.se>
parents: 33929
diff changeset
228 p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
229 output = p2.communicate()[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
230
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
231
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
232 Replacing os.system()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
233 ---------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
234 sts = os.system("mycmd" + " myarg")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
235 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
236 p = Popen("mycmd" + " myarg", shell=True)
39041
8cc9784130a0 Fix doco. Backport candidate.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38917
diff changeset
237 pid, sts = os.waitpid(p.pid, 0)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
238
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
239 Note:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
240
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
241 * Calling the program through the shell is usually not required.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
242
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
243 * It's easier to look at the returncode attribute than the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
244 exitstatus.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
245
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
246 A more real-world example would look like this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
247
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
248 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
249 retcode = call("mycmd" + " myarg", shell=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
250 if retcode < 0:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
251 print >>sys.stderr, "Child was terminated by signal", -retcode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
253 print >>sys.stderr, "Child returned", retcode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254 except OSError, e:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255 print >>sys.stderr, "Execution failed:", e
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
256
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
257
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
258 Replacing os.spawn*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
259 -------------------
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
260 P_NOWAIT example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
261
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
262 pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
263 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
264 pid = Popen(["/bin/mycmd", "myarg"]).pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
265
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
266
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
267 P_WAIT example:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
268
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
269 retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
270 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
271 retcode = call(["/bin/mycmd", "myarg"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
272
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
273
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
274 Vector example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
275
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
276 os.spawnvp(os.P_NOWAIT, path, args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
277 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278 Popen([path] + args[1:])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
279
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
280
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
281 Environment example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
282
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
283 os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
284 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
285 Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
286
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
287
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
288 Replacing os.popen*
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289 -------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290 pipe = os.popen(cmd, mode='r', bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
291 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
292 pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
293
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
294 pipe = os.popen(cmd, mode='w', bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
295 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
296 pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
297
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
298
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
299 (child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
300 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
301 p = Popen(cmd, shell=True, bufsize=bufsize,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
302 stdin=PIPE, stdout=PIPE, close_fds=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
303 (child_stdin, child_stdout) = (p.stdin, p.stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
304
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
305
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
306 (child_stdin,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
307 child_stdout,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
308 child_stderr) = os.popen3(cmd, mode, bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
309 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
310 p = Popen(cmd, shell=True, bufsize=bufsize,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
311 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
312 (child_stdin,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
313 child_stdout,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
314 child_stderr) = (p.stdin, p.stdout, p.stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
315
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
316
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
317 (child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
318 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
319 p = Popen(cmd, shell=True, bufsize=bufsize,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
320 stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
321 (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
322
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
323
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
324 Replacing popen2.*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
325 ------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
326 Note: If the cmd argument to popen2 functions is a string, the command
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
327 is executed through /bin/sh. If it is a list, the command is directly
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
328 executed.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
329
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
330 (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
331 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
332 p = Popen(["somestring"], shell=True, bufsize=bufsize
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
333 stdin=PIPE, stdout=PIPE, close_fds=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
334 (child_stdout, child_stdin) = (p.stdout, p.stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
335
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
336
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
337 (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
338 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
339 p = Popen(["mycmd", "myarg"], bufsize=bufsize,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
340 stdin=PIPE, stdout=PIPE, close_fds=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
341 (child_stdout, child_stdin) = (p.stdout, p.stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
342
41687
8edd746291fe Fix typo in docstring (the module is popen2, not 3).
Neal Norwitz <nnorwitz@gmail.com>
parents: 41503
diff changeset
343 The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
344 except that:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
345
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
346 * subprocess.Popen raises an exception if the execution fails
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
347 * the capturestderr argument is replaced with the stderr argument.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
348 * stdin=PIPE and stdout=PIPE must be specified.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
349 * popen2 closes all filedescriptors by default, but you have to specify
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
350 close_fds=True with subprocess.Popen.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
351 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
352
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
353 import sys
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
354 mswindows = (sys.platform == "win32")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
355
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
356 import os
34624
5fde17b35472 Made the module compatible with Python 2.2 again.
Peter Astrand <astrand@lysator.liu.se>
parents: 34587
diff changeset
357 import types
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
358 import traceback
44792
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
359 import gc
46479
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
360 import signal
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
361
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
362 # Exception classes used by this module.
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
363 class CalledProcessError(Exception):
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
364 """This exception is raised when a process run by check_call() returns
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
365 a non-zero exit status. The exit status will be stored in the
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
366 returncode attribute."""
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
367 def __init__(self, returncode, cmd):
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
368 self.returncode = returncode
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
369 self.cmd = cmd
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
370 def __str__(self):
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
371 return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
39117
acff1c34cca3 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 39084
diff changeset
372
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
373
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
374 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
375 import threading
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
376 import msvcrt
33751
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
377 if 0: # <-- change this to use pywin32 instead of the _subprocess driver
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378 import pywintypes
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
379 from win32api import GetStdHandle, STD_INPUT_HANDLE, \
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
380 STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
381 from win32api import GetCurrentProcess, DuplicateHandle, \
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
382 GetModuleFileName, GetVersion
33929
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
383 from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
384 from win32pipe import CreatePipe
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
385 from win32process import CreateProcess, STARTUPINFO, \
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
386 GetExitCodeProcess, STARTF_USESTDHANDLES, \
33929
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
387 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
46479
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
388 from win32process import TerminateProcess
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
33751
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
390 else:
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
391 from _subprocess import *
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
392 class STARTUPINFO:
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
393 dwFlags = 0
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
394 hStdInput = None
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
395 hStdOutput = None
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
396 hStdError = None
38589
7d31d031f8e1 Bug #1500293: fix memory leaks in _subprocess module.
Georg Brandl <georg@python.org>
parents: 38078
diff changeset
397 wShowWindow = 0
33751
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
398 class pywintypes:
aa2d6060495a Replace dynamic try/except with "if 0", to keep py2exe happy. If you
Fredrik Lundh <fredrik@pythonware.com>
parents: 33735
diff changeset
399 error = IOError
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
401 import select
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
402 import errno
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 import fcntl
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
404 import pickle
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
406 __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"]
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
408 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409 MAXFD = os.sysconf("SC_OPEN_MAX")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 except:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
411 MAXFD = 256
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
413 # True/False does not exist on 2.2.0
48194
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
414 #try:
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
415 # False
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
416 #except NameError:
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
417 # False = 0
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
418 # True = 1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
419
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
420 _active = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
421
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
422 def _cleanup():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
423 for inst in _active[:]:
48154
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
424 if inst._internal_poll(_deadstate=sys.maxint) >= 0:
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
425 try:
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
426 _active.remove(inst)
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
427 except ValueError:
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
428 # This can happen if two threads create a new Popen instance.
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
429 # It's harmless that it was already removed, so ignore.
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
430 pass
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
431
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
432 PIPE = -1
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
433 STDOUT = -2
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
434
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
435
34111
73b09c2b788b Changed signature of call function to avoid confusion: this 'args' is not the same as the one to the Popen constructor
Peter Astrand <astrand@lysator.liu.se>
parents: 34052
diff changeset
436 def call(*popenargs, **kwargs):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
437 """Run command with arguments. Wait for command to complete, then
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
438 return the returncode attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
439
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
440 The arguments are the same as for the Popen constructor. Example:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
441
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
442 retcode = call(["ls", "-l"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
443 """
34111
73b09c2b788b Changed signature of call function to avoid confusion: this 'args' is not the same as the one to the Popen constructor
Peter Astrand <astrand@lysator.liu.se>
parents: 34052
diff changeset
444 return Popen(*popenargs, **kwargs).wait()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
445
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
447 def check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
448 """Run command with arguments. Wait for command to complete. If
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
449 the exit code was zero then return, otherwise raise
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
450 CalledProcessError. The CalledProcessError object will have the
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
451 return code in the returncode attribute.
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
452
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
453 The arguments are the same as for the Popen constructor. Example:
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
454
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
455 check_call(["ls", "-l"])
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
456 """
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
457 retcode = call(*popenargs, **kwargs)
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
458 cmd = kwargs.get("args")
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
459 if cmd is None:
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
460 cmd = popenargs[0]
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
461 if retcode:
39084
9f2c3de74856 Bug #1223937: CalledProcessError.errno -> CalledProcessError.returncode.
Peter Astrand <astrand@lysator.liu.se>
parents: 39041
diff changeset
462 raise CalledProcessError(retcode, cmd)
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
463 return retcode
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
464
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
465
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
466 def list2cmdline(seq):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
467 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
468 Translate a sequence of arguments into a command line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469 string, using the same rules as the MS C runtime:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
470
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
471 1) Arguments are delimited by white space, which is either a
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472 space or a tab.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
473
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
474 2) A string surrounded by double quotation marks is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
475 interpreted as a single argument, regardless of white space
44801
c23892f5a69f Fix issue 1300: Quote command line arguments that contain a '|' character in
Gregory P. Smith <greg@mad-scientist.com>
parents: 44798
diff changeset
476 or pipe characters contained within. A quoted string can be
c23892f5a69f Fix issue 1300: Quote command line arguments that contain a '|' character in
Gregory P. Smith <greg@mad-scientist.com>
parents: 44798
diff changeset
477 embedded in an argument.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
478
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
479 3) A double quotation mark preceded by a backslash is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
480 interpreted as a literal double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
481
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
482 4) Backslashes are interpreted literally, unless they
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
483 immediately precede a double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
484
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
485 5) If backslashes immediately precede a double quotation mark,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
486 every pair of backslashes is interpreted as a literal
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
487 backslash. If the number of backslashes is odd, the last
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
488 backslash escapes the next double quotation mark as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
489 described in rule 3.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
490 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
491
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
492 # See
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
493 # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
494 result = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
495 needquote = False
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
496 for arg in seq:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
497 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
498
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
499 # Add a space to separate this argument from the others
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
500 if result:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
501 result.append(' ')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
502
44801
c23892f5a69f Fix issue 1300: Quote command line arguments that contain a '|' character in
Gregory P. Smith <greg@mad-scientist.com>
parents: 44798
diff changeset
503 needquote = (" " in arg) or ("\t" in arg) or ("|" in arg) or not arg
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
504 if needquote:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
505 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
506
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
507 for c in arg:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
508 if c == '\\':
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
509 # Don't know if we need to double yet.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
510 bs_buf.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
511 elif c == '"':
44790
210323e2a927 fix comment typos, use not arg instead of arg == "", add test coverage
Gregory P. Smith <greg@mad-scientist.com>
parents: 44785
diff changeset
512 # Double backslashes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
513 result.append('\\' * len(bs_buf)*2)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
515 result.append('\\"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
516 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
517 # Normal char
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
520 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
521 result.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
522
44790
210323e2a927 fix comment typos, use not arg instead of arg == "", add test coverage
Gregory P. Smith <greg@mad-scientist.com>
parents: 44785
diff changeset
523 # Add remaining backslashes, if any.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
524 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
526
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
527 if needquote:
34675
8f0456425715 Corrected bug in list2cmdline wrt backslashes. Fixes #1083306.
Peter Astrand <astrand@lysator.liu.se>
parents: 34672
diff changeset
528 result.extend(bs_buf)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
529 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
530
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
531 return ''.join(result)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
532
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
533
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
534 class Popen(object):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
535 def __init__(self, args, bufsize=0, executable=None,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
536 stdin=None, stdout=None, stderr=None,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
537 preexec_fn=None, close_fds=False, shell=False,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
538 cwd=None, env=None, universal_newlines=False,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
539 startupinfo=None, creationflags=0):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
540 """Create new Popen instance."""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
541 _cleanup()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
542
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
543 self._child_created = False
34052
79d2ae0a62ef Raise TypeError if bufsize argument is not an integer. Patch 1071755, slightly modified.
Peter Astrand <astrand@lysator.liu.se>
parents: 34050
diff changeset
544 if not isinstance(bufsize, (int, long)):
79d2ae0a62ef Raise TypeError if bufsize argument is not an integer. Patch 1071755, slightly modified.
Peter Astrand <astrand@lysator.liu.se>
parents: 34050
diff changeset
545 raise TypeError("bufsize must be an integer")
79d2ae0a62ef Raise TypeError if bufsize argument is not an integer. Patch 1071755, slightly modified.
Peter Astrand <astrand@lysator.liu.se>
parents: 34050
diff changeset
546
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
547 if mswindows:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
548 if preexec_fn is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
549 raise ValueError("preexec_fn is not supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
550 "platforms")
41886
ec3b8e94a355 Applied patch 1669481, slightly modified: Support close_fds on Win32
Peter Astrand <astrand@lysator.liu.se>
parents: 41689
diff changeset
551 if close_fds and (stdin is not None or stdout is not None or
ec3b8e94a355 Applied patch 1669481, slightly modified: Support close_fds on Win32
Peter Astrand <astrand@lysator.liu.se>
parents: 41689
diff changeset
552 stderr is not None):
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
553 raise ValueError("close_fds is not supported on Windows "
41886
ec3b8e94a355 Applied patch 1669481, slightly modified: Support close_fds on Win32
Peter Astrand <astrand@lysator.liu.se>
parents: 41689
diff changeset
554 "platforms if you redirect stdin/stdout/stderr")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
556 # POSIX
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
557 if startupinfo is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
558 raise ValueError("startupinfo is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
559 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
560 if creationflags != 0:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
561 raise ValueError("creationflags is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
562 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
563
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
564 self.stdin = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
565 self.stdout = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
566 self.stderr = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567 self.pid = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
568 self.returncode = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
569 self.universal_newlines = universal_newlines
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571 # Input and output objects. The general principle is like
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
572 # this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
573 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
574 # Parent Child
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
575 # ------ -----
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
576 # p2cwrite ---stdin---> p2cread
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577 # c2pread <--stdout--- c2pwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
578 # errread <--stderr--- errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
579 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
580 # On POSIX, the child objects are file descriptors. On
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
581 # Windows, these are Windows file handles. The parent objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
582 # are file descriptors on both platforms. The parent objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
583 # are None when not using PIPEs. The child objects are None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
584 # when not redirecting.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
585
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
586 (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
587 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
588 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
589
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
590 self._execute_child(args, executable, preexec_fn, close_fds,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
591 cwd, env, universal_newlines,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
594 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
595 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
596
40746
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
597 # On Windows, you cannot just redirect one or two handles: You
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
598 # either have to redirect all three or none. If the subprocess
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
599 # user has only redirected one or two handles, we are
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
600 # automatically creating PIPEs for the rest. We should close
41133
01355124ce40 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 40746
diff changeset
601 # these after the process is started. See bug #1124861.
40746
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
602 if mswindows:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
603 if stdin is None and p2cwrite is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
604 os.close(p2cwrite)
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
605 p2cwrite = None
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
606 if stdout is None and c2pread is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
607 os.close(c2pread)
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
608 c2pread = None
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
609 if stderr is None and errread is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
610 os.close(errread)
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
611 errread = None
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
612
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
613 if p2cwrite is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
614 self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
615 if c2pread is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
616 if universal_newlines:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
617 self.stdout = os.fdopen(c2pread, 'rU', bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
618 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
619 self.stdout = os.fdopen(c2pread, 'rb', bufsize)
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
620 if errread is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
621 if universal_newlines:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
622 self.stderr = os.fdopen(errread, 'rU', bufsize)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
623 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
624 self.stderr = os.fdopen(errread, 'rb', bufsize)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
625
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
626
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
627 def _translate_newlines(self, data):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
628 data = data.replace("\r\n", "\n")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
629 data = data.replace("\r", "\n")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
630 return data
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
631
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
632
41503
2804e48861ba Bug #1704790: bind name "sys" locally in __del__ method so that it is
Georg Brandl <georg@python.org>
parents: 41133
diff changeset
633 def __del__(self, sys=sys):
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
634 if not self._child_created:
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
635 # We didn't get to successfully create a child process.
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
636 return
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
637 # In case the child hasn't been waited on, check if it's done.
48154
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
638 self._internal_poll(_deadstate=sys.maxint)
39122
8fe6786f5144 Guard for _active being None in __del__ method.
Georg Brandl <georg@python.org>
parents: 39117
diff changeset
639 if self.returncode is None and _active is not None:
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
640 # Child is still running, keep us alive until we can wait on it.
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
641 _active.append(self)
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
642
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
643
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
644 def communicate(self, input=None):
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
645 """Interact with process: Send data to stdin. Read data from
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
646 stdout and stderr, until end-of-file is reached. Wait for
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
647 process to terminate. The optional input argument should be a
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
648 string to be sent to the child process, or None, if no data
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
649 should be sent to the child.
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
650
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
651 communicate() returns a tuple (stdout, stderr)."""
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
652
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
653 # Optimization: If we are only using one pipe, or no pipe at
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
654 # all, using select() or threads is unnecessary.
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
655 if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
656 stdout = None
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
657 stderr = None
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
658 if self.stdin:
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
659 if input:
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
660 self.stdin.write(input)
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
661 self.stdin.close()
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
662 elif self.stdout:
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
663 stdout = self.stdout.read()
47338
273e8de34603 Fixes issue2791: subprocess.Popen.communicate leaked a file descripton until
Gregory P. Smith <greg@mad-scientist.com>
parents: 46479
diff changeset
664 self.stdout.close()
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
665 elif self.stderr:
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
666 stderr = self.stderr.read()
47338
273e8de34603 Fixes issue2791: subprocess.Popen.communicate leaked a file descripton until
Gregory P. Smith <greg@mad-scientist.com>
parents: 46479
diff changeset
667 self.stderr.close()
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
668 self.wait()
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
669 return (stdout, stderr)
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
670
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
671 return self._communicate(input)
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
672
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
673
48154
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
674 def poll(self):
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
675 return self._internal_poll()
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
676
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
677
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
678 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
679 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
680 # Windows methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
681 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
682 def _get_handles(self, stdin, stdout, stderr):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
683 """Construct and return tupel with IO objects:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
684 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
685 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
686 if stdin is None and stdout is None and stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
687 return (None, None, None, None, None, None)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
688
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
689 p2cread, p2cwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
690 c2pread, c2pwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
691 errread, errwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
692
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
693 if stdin is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
694 p2cread = GetStdHandle(STD_INPUT_HANDLE)
40746
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
695 if p2cread is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
696 pass
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
697 elif stdin is None or stdin == PIPE:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
698 p2cread, p2cwrite = CreatePipe(None, 0)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
699 # Detach and turn into fd
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
700 p2cwrite = p2cwrite.Detach()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
701 p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
702 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
703 p2cread = msvcrt.get_osfhandle(stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
704 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
705 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
706 p2cread = msvcrt.get_osfhandle(stdin.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
707 p2cread = self._make_inheritable(p2cread)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
708
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
709 if stdout is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
710 c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
40746
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
711 if c2pwrite is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
712 pass
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
713 elif stdout is None or stdout == PIPE:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
714 c2pread, c2pwrite = CreatePipe(None, 0)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
715 # Detach and turn into fd
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
716 c2pread = c2pread.Detach()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
717 c2pread = msvcrt.open_osfhandle(c2pread, 0)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
718 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
719 c2pwrite = msvcrt.get_osfhandle(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
720 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
722 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
723 c2pwrite = self._make_inheritable(c2pwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
724
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
725 if stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
726 errwrite = GetStdHandle(STD_ERROR_HANDLE)
40746
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
727 if errwrite is not None:
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
728 pass
d3e88631f92b Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
Peter Astrand <astrand@lysator.liu.se>
parents: 40740
diff changeset
729 elif stderr is None or stderr == PIPE:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
730 errread, errwrite = CreatePipe(None, 0)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
731 # Detach and turn into fd
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 errread = errread.Detach()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
733 errread = msvcrt.open_osfhandle(errread, 0)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
734 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735 errwrite = c2pwrite
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
736 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
737 errwrite = msvcrt.get_osfhandle(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
738 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
739 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
740 errwrite = msvcrt.get_osfhandle(stderr.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
741 errwrite = self._make_inheritable(errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
742
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
744 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
745 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
746
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
747
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
748 def _make_inheritable(self, handle):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
749 """Return a duplicate of handle, which is inheritable"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
750 return DuplicateHandle(GetCurrentProcess(), handle,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
751 GetCurrentProcess(), 0, 1,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
752 DUPLICATE_SAME_ACCESS)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
753
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
754
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755 def _find_w9xpopen(self):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
756 """Find and return absolut path to w9xpopen.exe"""
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
757 w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
758 "w9xpopen.exe")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
759 if not os.path.exists(w9xpopen):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
760 # Eeek - file-not-found - possibly an embedding
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
761 # situation - see if we can locate it in sys.exec_prefix
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
762 w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
763 "w9xpopen.exe")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 if not os.path.exists(w9xpopen):
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
765 raise RuntimeError("Cannot locate w9xpopen.exe, which is "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
766 "needed for Popen to work with your "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
767 "shell or platform.")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768 return w9xpopen
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
770
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
771 def _execute_child(self, args, executable, preexec_fn, close_fds,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 cwd, env, universal_newlines,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
773 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
774 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 errread, errwrite):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 """Execute program (MS Windows version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778
34624
5fde17b35472 Made the module compatible with Python 2.2 again.
Peter Astrand <astrand@lysator.liu.se>
parents: 34587
diff changeset
779 if not isinstance(args, types.StringTypes):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
780 args = list2cmdline(args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
781
33929
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
782 # Process startup details
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
783 if startupinfo is None:
38589
7d31d031f8e1 Bug #1500293: fix memory leaks in _subprocess module.
Georg Brandl <georg@python.org>
parents: 38078
diff changeset
784 startupinfo = STARTUPINFO()
7d31d031f8e1 Bug #1500293: fix memory leaks in _subprocess module.
Georg Brandl <georg@python.org>
parents: 38078
diff changeset
785 if None not in (p2cread, c2pwrite, errwrite):
33929
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
786 startupinfo.dwFlags |= STARTF_USESTDHANDLES
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
787 startupinfo.hStdInput = p2cread
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
788 startupinfo.hStdOutput = c2pwrite
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
789 startupinfo.hStdError = errwrite
66223a9ebe48 When using shell=True on Windows, don't display a shell window by default. Fixes #1057061.
Peter Astrand <astrand@lysator.liu.se>
parents: 33776
diff changeset
790
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791 if shell:
38589
7d31d031f8e1 Bug #1500293: fix memory leaks in _subprocess module.
Georg Brandl <georg@python.org>
parents: 38078
diff changeset
792 startupinfo.dwFlags |= STARTF_USESHOWWINDOW
7d31d031f8e1 Bug #1500293: fix memory leaks in _subprocess module.
Georg Brandl <georg@python.org>
parents: 38078
diff changeset
793 startupinfo.wShowWindow = SW_HIDE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
794 comspec = os.environ.get("COMSPEC", "cmd.exe")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
795 args = comspec + " /c " + args
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
796 if (GetVersion() >= 0x80000000L or
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
797 os.path.basename(comspec).lower() == "command.com"):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
798 # Win9x, or using command.com on NT. We need to
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
799 # use the w9xpopen intermediate program. For more
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
800 # information, see KB Q150956
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
801 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
802 w9xpopen = self._find_w9xpopen()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
803 args = '"%s" %s' % (w9xpopen, args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 # Not passing CREATE_NEW_CONSOLE has been known to
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
805 # cause random failures on win9x. Specifically a
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
806 # dialog: "Your program accessed mem currently in
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
807 # use at xxx" and a hopeful warning about the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
808 # stability of your system. Cost is Ctrl+C wont
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
809 # kill children.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
810 creationflags |= CREATE_NEW_CONSOLE
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
811
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
812 # Start the process
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
813 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
814 hp, ht, pid, tid = CreateProcess(executable, args,
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
815 # no special security
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
816 None, None,
41886
ec3b8e94a355 Applied patch 1669481, slightly modified: Support close_fds on Win32
Peter Astrand <astrand@lysator.liu.se>
parents: 41689
diff changeset
817 int(not close_fds),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
818 creationflags,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
819 env,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
820 cwd,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
821 startupinfo)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
822 except pywintypes.error, e:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
823 # Translate pywintypes.error to WindowsError, which is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
824 # a subclass of OSError. FIXME: We should really
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
825 # translate errno using _sys_errlist (or simliar), but
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
826 # how can this be done from Python?
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
827 raise WindowsError(*e.args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
828
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
829 # Retain the process handle, but close the thread handle
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
830 self._child_created = True
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
831 self._handle = hp
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
832 self.pid = pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
833 ht.Close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
834
33727
0236b6530c46 Typo fix
Andrew M. Kuchling <amk@amk.ca>
parents: 33723
diff changeset
835 # Child is launched. Close the parent's copy of those pipe
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
836 # handles that only the child should have open. You need
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
837 # to make sure that no handles to the write end of the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
838 # output pipe are maintained in this process or else the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
839 # pipe will not close when the child process exits and the
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
840 # ReadFile will hang.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
841 if p2cread is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
842 p2cread.Close()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
843 if c2pwrite is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
844 c2pwrite.Close()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
845 if errwrite is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
846 errwrite.Close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
847
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
848
48154
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
849 def _internal_poll(self, _deadstate=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
850 """Check if child process has terminated. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
851 attribute."""
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
852 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
853 if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
854 self.returncode = GetExitCodeProcess(self._handle)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
855 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
856
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
857
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
858 def wait(self):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
859 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
860 attribute."""
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
861 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
862 obj = WaitForSingleObject(self._handle, INFINITE)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
863 self.returncode = GetExitCodeProcess(self._handle)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
864 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
865
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
866
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
867 def _readerthread(self, fh, buffer):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
868 buffer.append(fh.read())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
869
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
870
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
871 def _communicate(self, input):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
872 stdout = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
873 stderr = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
874
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
875 if self.stdout:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
876 stdout = []
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
877 stdout_thread = threading.Thread(target=self._readerthread,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
878 args=(self.stdout, stdout))
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
879 stdout_thread.setDaemon(True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
880 stdout_thread.start()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
881 if self.stderr:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
882 stderr = []
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
883 stderr_thread = threading.Thread(target=self._readerthread,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
884 args=(self.stderr, stderr))
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
885 stderr_thread.setDaemon(True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
886 stderr_thread.start()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
887
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
888 if self.stdin:
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
889 if input is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
890 self.stdin.write(input)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
891 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
892
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
893 if self.stdout:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
894 stdout_thread.join()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
895 if self.stderr:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
896 stderr_thread.join()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
897
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
898 # All data exchanged. Translate lists into strings.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
899 if stdout is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
900 stdout = stdout[0]
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
901 if stderr is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
902 stderr = stderr[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
903
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
904 # Translate newlines, if requested. We cannot let the file
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
905 # object do the translation: It is based on stdio, which is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
906 # impossible to combine with select (unless forcing no
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
907 # buffering).
38078
b1cbc605bec9 Try to fix breakage caused by patch #1479181, r45850
Neal Norwitz <nnorwitz@gmail.com>
parents: 37563
diff changeset
908 if self.universal_newlines and hasattr(file, 'newlines'):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
909 if stdout:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
910 stdout = self._translate_newlines(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
911 if stderr:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
912 stderr = self._translate_newlines(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
913
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
914 self.wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
915 return (stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
916
46479
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
917 def send_signal(self, sig):
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
918 """Send a signal to the process
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
919 """
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
920 if sig == signal.SIGTERM:
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
921 self.terminate()
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
922 else:
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
923 raise ValueError("Only SIGTERM is supported on Windows")
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
924
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
925 def terminate(self):
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
926 """Terminates the process
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
927 """
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
928 TerminateProcess(self._handle, 1)
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
929
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
930 kill = terminate
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
931
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
932 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
933 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
934 # POSIX methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
935 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
936 def _get_handles(self, stdin, stdout, stderr):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
937 """Construct and return tupel with IO objects:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
938 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
939 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
940 p2cread, p2cwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
941 c2pread, c2pwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
942 errread, errwrite = None, None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
943
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
944 if stdin is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
945 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
946 elif stdin == PIPE:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
947 p2cread, p2cwrite = os.pipe()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
948 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
949 p2cread = stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
950 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
951 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
952 p2cread = stdin.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
953
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
954 if stdout is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
955 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
956 elif stdout == PIPE:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
957 c2pread, c2pwrite = os.pipe()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
958 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
959 c2pwrite = stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
960 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
961 # Assuming file-like object
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
962 c2pwrite = stdout.fileno()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
963
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
964 if stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
965 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
966 elif stderr == PIPE:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
967 errread, errwrite = os.pipe()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
968 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
969 errwrite = c2pwrite
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
970 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
971 errwrite = stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
972 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
973 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
974 errwrite = stderr.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
975
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
976 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
977 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
979
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
981 def _set_cloexec_flag(self, fd):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
982 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
983 cloexec_flag = fcntl.FD_CLOEXEC
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
984 except AttributeError:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
985 cloexec_flag = 1
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
986
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
987 old = fcntl.fcntl(fd, fcntl.F_GETFD)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
988 fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
989
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
990
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
991 def _close_fds(self, but):
44785
b520d33bee06 #1663329: add os.closerange() to close a range of fds,
Georg Brandl <georg@python.org>
parents: 41886
diff changeset
992 os.closerange(3, but)
b520d33bee06 #1663329: add os.closerange() to close a range of fds,
Georg Brandl <georg@python.org>
parents: 41886
diff changeset
993 os.closerange(but + 1, MAXFD)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
994
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
995
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
996 def _execute_child(self, args, executable, preexec_fn, close_fds,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
997 cwd, env, universal_newlines,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1000 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1001 errread, errwrite):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1002 """Execute program (POSIX version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1003
34624
5fde17b35472 Made the module compatible with Python 2.2 again.
Peter Astrand <astrand@lysator.liu.se>
parents: 34587
diff changeset
1004 if isinstance(args, types.StringTypes):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1005 args = [args]
40244
a72d970c384b Bug #1357915: allow all sequence types for shell arguments in
Georg Brandl <georg@python.org>
parents: 39793
diff changeset
1006 else:
a72d970c384b Bug #1357915: allow all sequence types for shell arguments in
Georg Brandl <georg@python.org>
parents: 39793
diff changeset
1007 args = list(args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1008
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1009 if shell:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1010 args = ["/bin/sh", "-c"] + args
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1011
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1012 if executable is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1013 executable = args[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1014
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1015 # For transferring possible exec failure from child to parent
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 # The first char specifies the exception type: 0 means
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1017 # OSError, 1 means some other error.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 errpipe_read, errpipe_write = os.pipe()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1019 self._set_cloexec_flag(errpipe_write)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1020
44792
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1021 gc_was_enabled = gc.isenabled()
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1022 # Disable gc to avoid bug where gc -> file_dealloc ->
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1023 # write to stderr -> hang. http://bugs.python.org/issue1336
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1024 gc.disable()
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1025 try:
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1026 self.pid = os.fork()
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1027 except:
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1028 if gc_was_enabled:
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1029 gc.enable()
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1030 raise
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1031 self._child_created = True
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1032 if self.pid == 0:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1033 # Child
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1034 try:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1035 # Close parent's pipe ends
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1036 if p2cwrite is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1037 os.close(p2cwrite)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1038 if c2pread is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1039 os.close(c2pread)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1040 if errread is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1041 os.close(errread)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1042 os.close(errpipe_read)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1043
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1044 # Dup fds for child
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1045 if p2cread is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1046 os.dup2(p2cread, 0)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1047 if c2pwrite is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1048 os.dup2(c2pwrite, 1)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1049 if errwrite is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1050 os.dup2(errwrite, 2)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1051
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1052 # Close pipe fds. Make sure we don't close the same
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1053 # fd more than once, or standard fds.
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1054 if p2cread is not None and p2cread not in (0,):
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1055 os.close(p2cread)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1056 if c2pwrite is not None and c2pwrite not in (p2cread, 1):
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1057 os.close(c2pwrite)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1058 if errwrite is not None and errwrite not in (p2cread, c2pwrite, 2):
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1059 os.close(errwrite)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1060
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1061 # Close all other fds, if asked for
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1062 if close_fds:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1063 self._close_fds(but=errpipe_write)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1064
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1065 if cwd is not None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1066 os.chdir(cwd)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1067
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1068 if preexec_fn:
48194
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
1069 preexec_fn()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1070
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1071 if env is None:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1072 os.execvp(executable, args)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1073 else:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1074 os.execvpe(executable, args, env)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1075
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1076 except:
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1077 exc_type, exc_value, tb = sys.exc_info()
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1078 # Save the traceback and attach it to the exception object
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1079 exc_lines = traceback.format_exception(exc_type,
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1080 exc_value,
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1081 tb)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1082 exc_value.child_traceback = ''.join(exc_lines)
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1083 os.write(errpipe_write, pickle.dumps(exc_value))
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1084
44798
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1085 # This exitcode won't be reported to applications, so it
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1086 # really doesn't matter what we return.
5e66030f1a67 Undo an unnecessary else: and indentation that r60104 added.
Gregory P. Smith <greg@mad-scientist.com>
parents: 44792
diff changeset
1087 os._exit(255)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 # Parent
44792
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1090 if gc_was_enabled:
b4d03a92bddf Fixes issue1336 - a race condition could occur when forking if the gc
Gregory P. Smith <greg@mad-scientist.com>
parents: 44790
diff changeset
1091 gc.enable()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1092 os.close(errpipe_write)
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
1093 if p2cread is not None and p2cwrite is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1094 os.close(p2cread)
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
1095 if c2pwrite is not None and c2pread is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1096 os.close(c2pwrite)
40740
ad8cdfb69872 We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
Peter Astrand <astrand@lysator.liu.se>
parents: 40732
diff changeset
1097 if errwrite is not None and errread is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1098 os.close(errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1099
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1100 # Wait for exec to fail or succeed; possibly raising exception
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1101 data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1102 os.close(errpipe_read)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1103 if data != "":
34303
cb30cfcb39e7 On UNIX, when the execution of the child fails, we must waitpid() to
Peter Astrand <astrand@lysator.liu.se>
parents: 34302
diff changeset
1104 os.waitpid(self.pid, 0)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1105 child_exception = pickle.loads(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1106 raise child_exception
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1107
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1108
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1109 def _handle_exitstatus(self, sts):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1110 if os.WIFSIGNALED(sts):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1111 self.returncode = -os.WTERMSIG(sts)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1112 elif os.WIFEXITED(sts):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113 self.returncode = os.WEXITSTATUS(sts)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1114 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1115 # Should never happen
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1116 raise RuntimeError("Unknown child exit status!")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1118
48154
288ca1c72888 - Issue #1857: subprocess.Popen.poll gained an additional _deadstate keyword
Gregory P. Smith <greg@mad-scientist.com>
parents: 47899
diff changeset
1119 def _internal_poll(self, _deadstate=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1120 """Check if child process has terminated. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1121 attribute."""
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1122 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1123 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1124 pid, sts = os.waitpid(self.pid, os.WNOHANG)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1125 if pid == self.pid:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1126 self._handle_exitstatus(sts)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1127 except os.error:
37563
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
1128 if _deadstate is not None:
42023f5b7d6d Patch #1467770: Add Popen objects to _active only in __del__.
Martin v. Löwis <martin@v.loewis.de>
parents: 35633
diff changeset
1129 self.returncode = _deadstate
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1130 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1132
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1133 def wait(self):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1135 attribute."""
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1136 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1137 pid, sts = os.waitpid(self.pid, 0)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1138 self._handle_exitstatus(sts)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1139 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1140
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1141
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
1142 def _communicate(self, input):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1143 read_set = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1144 write_set = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1145 stdout = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1146 stderr = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1147
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1148 if self.stdin:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1149 # Flush stdio buffer. This might block, if the user has
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150 # been writing to .stdin in an uncontrolled fashion.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1151 self.stdin.flush()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1152 if input:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 write_set.append(self.stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1155 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 if self.stdout:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1157 read_set.append(self.stdout)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1158 stdout = []
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1159 if self.stderr:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1160 read_set.append(self.stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1161 stderr = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1162
40568
99093b527c01 Avoid O(N**2) bottleneck in _communicate_(). Fixes #1598181.
Peter Astrand <astrand@lysator.liu.se>
parents: 40566
diff changeset
1163 input_offset = 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1164 while read_set or write_set:
47899
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1165 try:
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1166 rlist, wlist, xlist = select.select(read_set, write_set, [])
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1167 except select.error, e:
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1168 if e.args[0] == errno.EINTR:
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1169 continue
c3193b7156bb - Issue #2113: Fix error in subprocess.Popen if the select system call is
Gregory P. Smith <greg@mad-scientist.com>
parents: 47338
diff changeset
1170 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1171
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1172 if self.stdin in wlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1173 # When select has indicated that the file is writable,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1174 # we can write up to PIPE_BUF bytes without risk
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1175 # blocking. POSIX defines PIPE_BUF >= 512
48194
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
1176 chunk = input[input_offset : input_offset + 512]
6416e6044a30 Remove warnings generated for the suprocess module when run under -3. Required
Brett Cannon <bcannon@gmail.com>
parents: 48154
diff changeset
1177 bytes_written = os.write(self.stdin.fileno(), chunk)
40732
5dae0d7f683a Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 40619
diff changeset
1178 input_offset += bytes_written
40568
99093b527c01 Avoid O(N**2) bottleneck in _communicate_(). Fixes #1598181.
Peter Astrand <astrand@lysator.liu.se>
parents: 40566
diff changeset
1179 if input_offset >= len(input):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1180 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1181 write_set.remove(self.stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1182
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1183 if self.stdout in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1184 data = os.read(self.stdout.fileno(), 1024)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1185 if data == "":
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1186 self.stdout.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1187 read_set.remove(self.stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1188 stdout.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1189
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1190 if self.stderr in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1191 data = os.read(self.stderr.fileno(), 1024)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192 if data == "":
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1193 self.stderr.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1194 read_set.remove(self.stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1195 stderr.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1196
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1197 # All data exchanged. Translate lists into strings.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1198 if stdout is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1199 stdout = ''.join(stdout)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1200 if stderr is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1201 stderr = ''.join(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1202
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1203 # Translate newlines, if requested. We cannot let the file
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1204 # object do the translation: It is based on stdio, which is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1205 # impossible to combine with select (unless forcing no
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1206 # buffering).
38078
b1cbc605bec9 Try to fix breakage caused by patch #1479181, r45850
Neal Norwitz <nnorwitz@gmail.com>
parents: 37563
diff changeset
1207 if self.universal_newlines and hasattr(file, 'newlines'):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1208 if stdout:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1209 stdout = self._translate_newlines(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1210 if stderr:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1211 stderr = self._translate_newlines(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1212
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1213 self.wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1214 return (stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1215
46479
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1216 def send_signal(self, sig):
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1217 """Send a signal to the process
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1218 """
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1219 os.kill(self.pid, sig)
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1220
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1221 def terminate(self):
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1222 """Terminate the process with SIGTERM
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1223 """
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1224 self.send_signal(signal.SIGTERM)
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1225
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1226 def kill(self):
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1227 """Kill the process with SIGKILL
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1228 """
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1229 self.send_signal(signal.SIGKILL)
e16593da4898 Added kill, terminate and send_signal to subprocess.Popen
Christian Heimes <christian@cheimes.de>
parents: 44801
diff changeset
1230
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1232 def _demo_posix():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1233 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1234 # Example 1: Simple redirection: Get process list
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1235 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1236 plist = Popen(["ps"], stdout=PIPE).communicate()[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1237 print "Process list:"
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1238 print plist
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1239
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1240 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241 # Example 2: Change uid before executing child
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1242 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243 if os.getuid() == 0:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1244 p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1245 p.wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1247 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248 # Example 3: Connecting several subprocesses
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1249 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1250 print "Looking for 'hda'..."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 p1 = Popen(["dmesg"], stdout=PIPE)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252 p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1253 print repr(p2.communicate()[0])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1254
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1255 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1256 # Example 4: Catch execution error
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1257 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1258 print
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259 print "Trying a weird file..."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1260 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261 print Popen(["/this/path/does/not/exist"]).communicate()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1262 except OSError, e:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1263 if e.errno == errno.ENOENT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264 print "The file didn't exist. I thought so..."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1265 print "Child traceback:"
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266 print e.child_traceback
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268 print "Error", e.errno
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1269 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1270 print >>sys.stderr, "Gosh. No error."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1272
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273 def _demo_windows():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1274 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1275 # Example 1: Connecting several subprocesses
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1276 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1277 print "Looking for 'PROMPT' in set output..."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1278 p1 = Popen("set", stdout=PIPE, shell=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1279 p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1280 print repr(p2.communicate()[0])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1281
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1282 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283 # Example 2: Simple execution of program
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1284 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 print "Executing calc..."
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1286 p = Popen("calc")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1287 p.wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1288
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1289
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1290 if __name__ == "__main__":
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1292 _demo_windows()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1294 _demo_posix()