annotate Lib/subprocess.py @ 86127:a3d09c19bb93

merge with 3.3
author Georg Brandl <georg@python.org>
date Sun, 06 Oct 2013 19:24:00 +0200
parents ef889c3d5dc6
children 0ba7280545fe
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 #
35633
45aaa436b945 Changed license header: Now simply referring to PSF. This closes bug
Peter Astrand <astrand@lysator.liu.se>
parents: 34818
diff changeset
5 # 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
6 #
34587
e9ec2ce340fd Added copyright notice:
Peter Astrand <astrand@lysator.liu.se>
parents: 34575
diff changeset
7 # 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
8 # 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
9
33776
c5d951a0e0c3 Fix docstring formatting of escape sequences.
Raymond Hettinger <python@rcn.com>
parents: 33770
diff changeset
10 r"""subprocess - Subprocesses with accessible I/O streams
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
11
33770
c6aac03474c5 return codes are available on all platforms, not just on Unix
Fredrik Lundh <fredrik@pythonware.com>
parents: 33751
diff changeset
12 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
13 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
14 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
15
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
16 os.system
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17 os.spawn*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19 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
20 modules and functions can be found below.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22
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 Using the subprocess module
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25 ===========================
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26 This module defines one class called Popen:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27
82916
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
28 class Popen(args, bufsize=-1, executable=None,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
29 stdin=None, stdout=None, stderr=None,
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
30 preexec_fn=None, close_fds=True, shell=False,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
31 cwd=None, env=None, universal_newlines=False,
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
32 startupinfo=None, creationflags=0,
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
33 restore_signals=True, start_new_session=False, pass_fds=()):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
34
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
35
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
36 Arguments are:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
37
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
38 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
39 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
40 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
41
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
42 On POSIX, with shell=False (default): In this case, the Popen class
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
43 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
44 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
45 as the only item (the program to execute).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
46
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
47 On POSIX, with shell=True: If args is a string, it specifies the
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
48 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
49 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
50 will be treated as additional shell arguments.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
51
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
52 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
53 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
54 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
55 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
56 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
57 rules as the MS C runtime.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
58
82916
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
59 bufsize will be supplied as the corresponding argument to the io.open()
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
60 function when creating the stdin/stdout/stderr pipe file objects:
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
61 0 means unbuffered (read & write are one system call and can return short),
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
62 1 means line buffered, any other positive value means use a buffer of
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
63 approximately that size. A negative bufsize, the default, means the system
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
64 default of io.DEFAULT_BUFFER_SIZE will be used.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
66 stdin, stdout and stderr specify the executed programs' standard
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
67 input, standard output and standard error file handles, respectively.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
68 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
69 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
70 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
71 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
72 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
73 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
74 file handle as for stdout.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
76 On POSIX, if preexec_fn is set to a callable object, this object will be
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
77 called in the child process just before the child is executed. The use
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
78 of preexec_fn is not thread safe, using it in the presence of threads
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
79 could lead to a deadlock in the child process before the new executable
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
80 is executed.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
81
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82 If close_fds is true, all file descriptors except 0, 1 and 2 will be
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
83 closed before the child process is executed. The default for close_fds
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
84 varies by platform: Always true on POSIX. True when stdin/stdout/stderr
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
85 are None on Windows, false otherwise.
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
86
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
87 pass_fds is an optional sequence of file descriptors to keep open between the
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
88 parent and child. Providing any pass_fds implicitly sets close_fds to true.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
89
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90 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
91 shell.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
92
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
93 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
94 before the child is executed.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
95
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
96 On POSIX, if restore_signals is True all signals that Python sets to
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
97 SIG_IGN are restored to SIG_DFL in the child process before the exec.
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
98 Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals. This
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
99 parameter does nothing on Windows.
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
100
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
101 On POSIX, if start_new_session is True, the setsid() system call will be made
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
102 in the child process prior to executing the command.
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
103
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
104 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
105 process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106
84476
f4747e1ce2b1 Cleanup of documentation change from #17860
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 84160
diff changeset
107 If universal_newlines is false, the file objects stdin, stdout and stderr
f4747e1ce2b1 Cleanup of documentation change from #17860
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 84160
diff changeset
108 are opened as binary files, and no line ending conversion is done.
f4747e1ce2b1 Cleanup of documentation change from #17860
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 84160
diff changeset
109
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
110 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
111 opened as a text files, but lines may be terminated by any of '\n',
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
112 the Unix end-of-line convention, '\r', the old Macintosh convention or
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
113 '\r\n', the Windows convention. All of these external representations
82852
72056f06632f remove the long obsolete mention of universal newlines mode only being
Gregory P. Smith <greg@krypto.org>
parents: 81997
diff changeset
114 are seen as '\n' by the Python program. Also, the newlines attribute
72056f06632f remove the long obsolete mention of universal newlines mode only being
Gregory P. Smith <greg@krypto.org>
parents: 81997
diff changeset
115 of the file objects stdout, stdin and stderr are not updated by the
72056f06632f remove the long obsolete mention of universal newlines mode only being
Gregory P. Smith <greg@krypto.org>
parents: 81997
diff changeset
116 communicate() method.
33723
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 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
119 underlying CreateProcess() function. They can specify things such as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
120 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
121 (Windows only)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
122
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
123
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
124 This module also defines some shortcut functions:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
125
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
126 call(*popenargs, **kwargs):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
127 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
128 return the returncode attribute.
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 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
131
59471
ac80884ddcc3 Merged revisions 78736,78759,78761,78767,78788-78789 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59207
diff changeset
132 >>> retcode = subprocess.call(["ls", "-l"])
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
133
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
134 check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
135 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
136 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
137 CalledProcessError. The CalledProcessError object will have the
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
138 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
139
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
140 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
141
59471
ac80884ddcc3 Merged revisions 78736,78759,78761,78767,78788-78789 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59207
diff changeset
142 >>> subprocess.check_call(["ls", "-l"])
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
143 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
144
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
145 getstatusoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
146 Return (status, output) of executing cmd in a shell.
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
147
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
148 Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
149 (status, output). cmd is actually run as '{ cmd ; } 2>&1', so that the
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
150 returned output will contain output or error messages. A trailing newline
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
151 is stripped from the output. The exit status for the command can be
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
152 interpreted according to the rules for the C function wait(). Example:
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
153
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
154 >>> subprocess.getstatusoutput('ls /bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
155 (0, '/bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
156 >>> subprocess.getstatusoutput('cat /bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
157 (256, 'cat: /bin/junk: No such file or directory')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
158 >>> subprocess.getstatusoutput('/bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
159 (256, 'sh: /bin/junk: not found')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
160
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
161 getoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
162 Return output (stdout or stderr) of executing cmd in a shell.
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
163
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
164 Like getstatusoutput(), except the exit status is ignored and the return
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
165 value is a string containing the command's output. Example:
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
166
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
167 >>> subprocess.getoutput('ls /bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
168 '/bin/ls'
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
169
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
170 check_output(*popenargs, **kwargs):
82831
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
171 Run command with arguments and return its output.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
172
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
173 If the exit code was non-zero it raises a CalledProcessError. The
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
174 CalledProcessError object will have the return code in the returncode
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
175 attribute and output in the output attribute.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
176
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
177 The arguments are the same as for the Popen constructor. Example:
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
178
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
179 >>> output = subprocess.check_output(["ls", "-l", "/dev/null"])
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
180
83495
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
181 There is an additional optional argument, "input", allowing you to
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
182 pass a string to the subprocess's stdin. If you use this argument
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
183 you may not also use the Popen constructor's "stdin" argument.
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
184
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
185 Exceptions
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
186 ----------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
187 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
188 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
189 the exception object will have one extra attribute called
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
190 'child_traceback', which is a string containing traceback information
85221
e07f104133d5 #18705: fix a number of typos. Patch by Févry Thibault.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 84476
diff changeset
191 from the child's point of view.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
192
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
193 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
194 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
195 should prepare for OSErrors.
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 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
198
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
199 Exceptions defined within this module inherit from SubprocessError.
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
200 check_call() and check_output() will raise CalledProcessError if the
68465
bffe5809bfda whitespace fix
Gregory P. Smith <greg@krypto.org>
parents: 68463
diff changeset
201 called process returns a non-zero return code. TimeoutExpired
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
202 be raised if a timeout was specified and expired.
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
203
33723
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 Security
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
206 --------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
207 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
208 /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
209 metacharacters, can safely be passed to child processes.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210
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 Popen objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213 =============
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214 Instances of the Popen class have the following methods:
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 poll()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217 Check if child process has terminated. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
218 attribute.
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 wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
221 Wait for child process to terminate. Returns returncode attribute.
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 communicate(input=None)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
224 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
225 and stderr, until end-of-file is reached. Wait for process to
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
226 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
227 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
228 the child.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
229
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
230 communicate() returns a tuple (stdout, stderr).
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 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
233 method if the data size is large or unlimited.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
234
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
235 The following attributes are also available:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
236
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
237 stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
238 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
239 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
240
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
241 stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
242 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
243 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
244 None.
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 stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
247 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
248 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
249 None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
250
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
251 pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252 The process ID of the child process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
253
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254 returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255 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
256 hasn't terminated yet. A negative value -N indicates that the
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
257 child was terminated by signal N (POSIX only).
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
258
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
259
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
260 Replacing older functions with the subprocess module
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 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
263 for a.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
264
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
265 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
266 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
267 exception.
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 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
270 imported with "from subprocess import *".
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
271
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 Replacing /bin/sh shell backquote
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
274 ---------------------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
275 output=`mycmd myarg`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
276 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
277 output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278
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 Replacing shell pipe line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
281 -------------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
282 output=`dmesg | grep hda`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
283 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
284 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
285 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
286 output = p2.communicate()[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
287
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
288
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289 Replacing os.system()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290 ---------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
291 sts = os.system("mycmd" + " myarg")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
292 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
293 p = Popen("mycmd" + " myarg", shell=True)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
294 pid, sts = os.waitpid(p.pid, 0)
33723
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 Note:
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 * 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
299
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
300 * 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
301 exitstatus.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
302
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
303 A more real-world example would look like this:
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 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
306 retcode = call("mycmd" + " myarg", shell=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
307 if retcode < 0:
41843
1f7891d84d93 Remove native popen() and fdopen(), replacing them with subprocess calls.
Guido van Rossum <guido@python.org>
parents: 41732
diff changeset
308 print("Child was terminated by signal", -retcode, file=sys.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
309 else:
41843
1f7891d84d93 Remove native popen() and fdopen(), replacing them with subprocess calls.
Guido van Rossum <guido@python.org>
parents: 41732
diff changeset
310 print("Child returned", retcode, file=sys.stderr)
1f7891d84d93 Remove native popen() and fdopen(), replacing them with subprocess calls.
Guido van Rossum <guido@python.org>
parents: 41732
diff changeset
311 except OSError as e:
1f7891d84d93 Remove native popen() and fdopen(), replacing them with subprocess calls.
Guido van Rossum <guido@python.org>
parents: 41732
diff changeset
312 print("Execution failed:", e, file=sys.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
313
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
314
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
315 Replacing os.spawn*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
316 -------------------
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
317 P_NOWAIT example:
33723
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 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
320 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
321 pid = Popen(["/bin/mycmd", "myarg"]).pid
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 P_WAIT example:
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 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
327 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
328 retcode = call(["/bin/mycmd", "myarg"])
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
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
331 Vector example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
332
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
333 os.spawnvp(os.P_NOWAIT, path, args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
334 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
335 Popen([path] + args[1:])
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
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
338 Environment example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
339
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
340 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
341 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
342 Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
343 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
344
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
345 import sys
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
346 mswindows = (sys.platform == "win32")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
347
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
348 import io
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
349 import os
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
350 import time
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
351 import traceback
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
352 import gc
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
353 import signal
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
354 import builtins
66676
b37da60c9072 issue7213 + issue2320: Cause a DeprecationWarning if the close_fds argument is
Gregory P. Smith <greg@mad-scientist.com>
parents: 66622
diff changeset
355 import warnings
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
356 import errno
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
357 try:
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
358 from time import monotonic as _time
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
359 except ImportError:
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
360 from time import time as _time
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.
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
363 class SubprocessError(Exception): pass
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
364
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
365
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
366 class CalledProcessError(SubprocessError):
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
367 """This exception is raised when a process run by check_call() or
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
368 check_output() returns a non-zero exit status.
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
369 The exit status will be stored in the returncode attribute;
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
370 check_output() will also store the output in the output attribute.
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
371 """
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
372 def __init__(self, returncode, cmd, output=None):
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
373 self.returncode = returncode
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
374 self.cmd = cmd
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
375 self.output = output
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
376 def __str__(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
377 return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
378
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
379
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
380 class TimeoutExpired(SubprocessError):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
381 """This exception is raised when the timeout expires while waiting for a
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
382 child process.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
383 """
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
384 def __init__(self, cmd, timeout, output=None):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
385 self.cmd = cmd
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
386 self.timeout = timeout
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
387 self.output = output
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
388
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
389 def __str__(self):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
390 return ("Command '%s' timed out after %s seconds" %
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
391 (self.cmd, self.timeout))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
392
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
393
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
394 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 import threading
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
396 import msvcrt
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
397 import _winapi
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
398 class STARTUPINFO:
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
399 dwFlags = 0
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
400 hStdInput = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
401 hStdOutput = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
402 hStdError = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
403 wShowWindow = 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
404 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 import select
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
406 _has_poll = hasattr(select, 'poll')
70467
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
407 import _posixsubprocess
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
408
55626
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
409 # When select or poll has indicated that the file is writable,
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
410 # we can write up to _PIPE_BUF bytes without risk of blocking.
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
411 # POSIX defines PIPE_BUF as >= 512.
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
412 _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
413
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
414
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
415 __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
416 "getoutput", "check_output", "CalledProcessError", "DEVNULL"]
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
418 if mswindows:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
419 from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
420 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
421 STD_ERROR_HANDLE, SW_HIDE,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
422 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
70050
654d473f2951 normalize whitespace.
Gregory P. Smith <greg@krypto.org>
parents: 70049
diff changeset
423
69690
Brian Curtin <brian@python.org>
parents: 69155 69689
diff changeset
424 __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
69689
80971f71b0d9 Further fix #7838. CREATE_NEW_CONSOLE was exposed, but none of the
Brian Curtin <brian@python.org>
parents: 69154
diff changeset
425 "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
80971f71b0d9 Further fix #7838. CREATE_NEW_CONSOLE was exposed, but none of the
Brian Curtin <brian@python.org>
parents: 69154
diff changeset
426 "STD_ERROR_HANDLE", "SW_HIDE",
80971f71b0d9 Further fix #7838. CREATE_NEW_CONSOLE was exposed, but none of the
Brian Curtin <brian@python.org>
parents: 69154
diff changeset
427 "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"])
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
428
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
429 class Handle(int):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
430 closed = False
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
431
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
432 def Close(self, CloseHandle=_winapi.CloseHandle):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
433 if not self.closed:
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
434 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
435 CloseHandle(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
436
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
437 def Detach(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
438 if not self.closed:
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
439 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
440 return int(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
441 raise ValueError("already closed")
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
442
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
443 def __repr__(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
444 return "Handle(%d)" % int(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
445
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
446 __del__ = Close
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
447 __str__ = __repr__
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
448
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
449 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
450 MAXFD = os.sysconf("SC_OPEN_MAX")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
451 except:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
452 MAXFD = 256
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
453
71903
8ca7f109ce79 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71524
diff changeset
454 # This lists holds Popen instances for which the underlying process had not
8ca7f109ce79 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71524
diff changeset
455 # exited at the time its __del__ method got called: those processes are wait()ed
8ca7f109ce79 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71524
diff changeset
456 # for synchronously from _cleanup() when a new Popen object is created, to avoid
8ca7f109ce79 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71524
diff changeset
457 # zombie processes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
458 _active = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
459
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
460 def _cleanup():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
461 for inst in _active[:]:
48680
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
462 res = inst._internal_poll(_deadstate=sys.maxsize)
71903
8ca7f109ce79 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71524
diff changeset
463 if res is not None:
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
464 try:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
465 _active.remove(inst)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
466 except ValueError:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
467 # This can happen if two threads create a new Popen instance.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
468 # It's harmless that it was already removed, so ignore.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
469 pass
33723
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 PIPE = -1
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472 STDOUT = -2
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
473 DEVNULL = -3
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
474
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
475
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
476 def _eintr_retry_call(func, *args):
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
477 while True:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
478 try:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
479 return func(*args)
73085
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
480 except InterruptedError:
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
481 continue
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
482
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
483
77036
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
484 # XXX This function is only used by multiprocessing and the test suite,
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
485 # but it's here so that it can be imported when Python is compiled without
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
486 # threads.
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
487
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
488 def _args_from_interpreter_flags():
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
489 """Return a list of command-line arguments reproducing the current
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
490 settings in sys.flags and sys.warnoptions."""
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
491 flag_opt_map = {
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
492 'debug': 'd',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
493 # 'inspect': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
494 # 'interactive': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
495 'optimize': 'O',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
496 'dont_write_bytecode': 'B',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
497 'no_user_site': 's',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
498 'no_site': 'S',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
499 'ignore_environment': 'E',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
500 'verbose': 'v',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
501 'bytes_warning': 'b',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
502 'quiet': 'q',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
503 'hash_randomization': 'R',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
504 }
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
505 args = []
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
506 for flag, opt in flag_opt_map.items():
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
507 v = getattr(sys.flags, flag)
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
508 if v > 0:
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
509 args.append('-' + opt * v)
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
510 for opt in sys.warnoptions:
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
511 args.append('-W' + opt)
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
512 return args
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
513
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
514
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
515 def call(*popenargs, timeout=None, **kwargs):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
516 """Run command with arguments. Wait for command to complete or
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
517 timeout, then return the returncode attribute.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519 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
520
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
521 retcode = call(["ls", "-l"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
522 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
523 with Popen(*popenargs, **kwargs) as p:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
524 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
525 return p.wait(timeout=timeout)
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
526 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
527 p.kill()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
528 p.wait()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
529 raise
33723
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
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
532 def check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
533 """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
534 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
535 CalledProcessError. The CalledProcessError object will have the
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
536 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
537
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
538 The arguments are the same as for the call function. Example:
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
539
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
540 check_call(["ls", "-l"])
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
541 """
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
542 retcode = call(*popenargs, **kwargs)
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
543 if retcode:
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
544 cmd = kwargs.get("args")
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
545 if cmd is None:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
546 cmd = popenargs[0]
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
547 raise CalledProcessError(retcode, cmd)
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
548 return 0
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
549
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
550
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
551 def check_output(*popenargs, timeout=None, **kwargs):
82831
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
552 r"""Run command with arguments and return its output.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
553
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
554 If the exit code was non-zero it raises a CalledProcessError. The
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
555 CalledProcessError object will have the return code in the returncode
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
556 attribute and output in the output attribute.
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
557
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
558 The arguments are the same as for the Popen constructor. Example:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
559
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
560 >>> check_output(["ls", "-l", "/dev/null"])
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
561 b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
562
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
563 The stdout argument is not allowed as it is used internally.
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
564 To capture standard error in the result, use stderr=STDOUT.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
565
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
566 >>> check_output(["/bin/sh", "-c",
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
567 ... "ls -l non_existent_file ; exit 0"],
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
568 ... stderr=STDOUT)
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
569 b'ls: non_existent_file: No such file or directory\n'
82831
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
570
83495
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
571 There is an additional optional argument, "input", allowing you to
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
572 pass a string to the subprocess's stdin. If you use this argument
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
573 you may not also use the Popen constructor's "stdin" argument, as
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
574 it too will be used internally. Example:
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
575
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
576 >>> check_output(["sed", "-e", "s/foo/bar/"],
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
577 ... input=b"when in the course of fooman events\n")
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
578 b'when in the course of barman events\n'
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
579
82831
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
580 If universal_newlines=True is passed, the return value will be a
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
581 string rather than bytes.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
582 """
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
583 if 'stdout' in kwargs:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
584 raise ValueError('stdout argument not allowed, it will be overridden.')
83495
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
585 if 'input' in kwargs:
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
586 if 'stdin' in kwargs:
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
587 raise ValueError('stdin and input arguments may not both be used.')
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
588 inputdata = kwargs['input']
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
589 del kwargs['input']
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
590 kwargs['stdin'] = PIPE
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
591 else:
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
592 inputdata = None
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
593 with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
594 try:
83495
5c45d0ca984f Issue #16624: `subprocess.check_output` now accepts an `input` argument,
Serhiy Storchaka <storchaka@gmail.com>
parents: 82918
diff changeset
595 output, unused_err = process.communicate(inputdata, timeout=timeout)
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
596 except TimeoutExpired:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
597 process.kill()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
598 output, unused_err = process.communicate()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
599 raise TimeoutExpired(process.args, timeout, output=output)
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
600 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
601 process.kill()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
602 process.wait()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
603 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
604 retcode = process.poll()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
605 if retcode:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
606 raise CalledProcessError(retcode, process.args, output=output)
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
607 return output
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
608
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
609
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
610 def list2cmdline(seq):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
611 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
612 Translate a sequence of arguments into a command line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
613 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
614
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
615 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
616 space or a tab.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
617
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
618 2) A string surrounded by double quotation marks is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
619 interpreted as a single argument, regardless of white space
62404
5de52eb252da Merged revisions 82076 via svnmerge from
Jean-Paul Calderone <exarkun@divmod.com>
parents: 61585
diff changeset
620 contained within. A quoted string can be embedded in an
5de52eb252da Merged revisions 82076 via svnmerge from
Jean-Paul Calderone <exarkun@divmod.com>
parents: 61585
diff changeset
621 argument.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
622
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
623 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
624 interpreted as a literal double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
625
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
626 4) Backslashes are interpreted literally, unless they
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
627 immediately precede a double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
628
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
629 5) If backslashes immediately precede a double quotation mark,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
630 every pair of backslashes is interpreted as a literal
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
631 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
632 backslash escapes the next double quotation mark as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
633 described in rule 3.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
634 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
635
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
636 # See
57156
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
637 # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
638 # or search http://msdn.microsoft.com for
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
639 # "Parsing C++ Command-Line Arguments"
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 result = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 needquote = False
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
642 for arg in seq:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
643 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
644
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
645 # 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
646 if result:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
647 result.append(' ')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
648
62404
5de52eb252da Merged revisions 82076 via svnmerge from
Jean-Paul Calderone <exarkun@divmod.com>
parents: 61585
diff changeset
649 needquote = (" " in arg) or ("\t" in arg) or not arg
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650 if needquote:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
652
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
653 for c in arg:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
654 if c == '\\':
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
655 # 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
656 bs_buf.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
657 elif c == '"':
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
658 # Double backslashes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
659 result.append('\\' * len(bs_buf)*2)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
660 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
661 result.append('\\"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
662 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
663 # Normal char
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
664 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
665 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
666 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
667 result.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
668
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
669 # Add remaining backslashes, if any.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
670 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
671 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
672
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
673 if needquote:
34675
8f0456425715 Corrected bug in list2cmdline wrt backslashes. Fixes #1083306.
Peter Astrand <astrand@lysator.liu.se>
parents: 34672
diff changeset
674 result.extend(bs_buf)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
675 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
676
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
677 return ''.join(result)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
678
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
679
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
680 # Various tools for executing commands and looking at their output and status.
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
681 #
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
682 # NB This only works (and is only relevant) for POSIX.
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
683
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
684 def getstatusoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
685 """Return (status, output) of executing cmd in a shell.
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
686
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
687 Execute the string 'cmd' in a shell with os.popen() and return a 2-tuple
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
688 (status, output). cmd is actually run as '{ cmd ; } 2>&1', so that the
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
689 returned output will contain output or error messages. A trailing newline
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
690 is stripped from the output. The exit status for the command can be
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
691 interpreted according to the rules for the C function wait(). Example:
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
692
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
693 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
694 >>> subprocess.getstatusoutput('ls /bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
695 (0, '/bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
696 >>> subprocess.getstatusoutput('cat /bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
697 (256, 'cat: /bin/junk: No such file or directory')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
698 >>> subprocess.getstatusoutput('/bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
699 (256, 'sh: /bin/junk: not found')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
700 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
701 with os.popen('{ ' + cmd + '; } 2>&1', 'r') as pipe:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
702 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
703 text = pipe.read()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
704 sts = pipe.close()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
705 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
706 process = pipe._proc
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
707 process.kill()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
708 process.wait()
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
709 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
710 if sts is None:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
711 sts = 0
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
712 if text[-1:] == '\n':
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
713 text = text[:-1]
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
714 return sts, text
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
715
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
716
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
717 def getoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
718 """Return output (stdout or stderr) of executing cmd in a shell.
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
719
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
720 Like getstatusoutput(), except the exit status is ignored and the return
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
721 value is a string containing the command's output. Example:
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
722
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
723 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
724 >>> subprocess.getoutput('ls /bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
725 '/bin/ls'
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
726 """
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
727 return getstatusoutput(cmd)[1]
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
728
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
729
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
730 _PLATFORM_DEFAULT_CLOSE_FDS = object()
66867
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
731
eab8f91f5754 Get rid of the close_fds DeprecationWarning. Changes the default on a per
Gregory P. Smith <greg@mad-scientist.com>
parents: 66723
diff changeset
732
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
733 class Popen(object):
82916
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
734 def __init__(self, args, bufsize=-1, executable=None,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735 stdin=None, stdout=None, stderr=None,
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
736 preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
737 shell=False, cwd=None, env=None, universal_newlines=False,
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
738 startupinfo=None, creationflags=0,
66692
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
739 restore_signals=True, start_new_session=False,
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
740 pass_fds=()):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
741 """Create new Popen instance."""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
742 _cleanup()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
744 self._child_created = False
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
745 self._input = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
746 self._communication_started = False
41984
e420039368b7 The bufsize argument to Popen() should accept None meaning the default (0).
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
747 if bufsize is None:
82916
3ecf709dfe69 Fixes issue #17488: Change the subprocess.Popen bufsize parameter default value
Gregory P. Smith <greg@krypto.org>
parents: 82852
diff changeset
748 bufsize = -1 # Restore default
41592
1e5a2a2b18ee Fix various spots where int/long and str/unicode unification
Walter Dörwald <walter@livinglogic.de>
parents: 41554
diff changeset
749 if not isinstance(bufsize, int):
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
750 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
751
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
752 if mswindows:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
753 if preexec_fn is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
754 raise ValueError("preexec_fn is not supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
755 "platforms")
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
756 any_stdio_set = (stdin is not None or stdout is not None or
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
757 stderr is not None)
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
758 if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
759 if any_stdio_set:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
760 close_fds = False
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
761 else:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
762 close_fds = True
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
763 elif close_fds and any_stdio_set:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
764 raise ValueError(
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
765 "close_fds is not supported on Windows platforms"
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
766 " if you redirect stdin/stdout/stderr")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768 # POSIX
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
769 if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
770 close_fds = True
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
771 if pass_fds and not close_fds:
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
772 warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
773 close_fds = True
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
774 if startupinfo is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
775 raise ValueError("startupinfo is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
776 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 if creationflags != 0:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
778 raise ValueError("creationflags is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
779 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
780
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
781 self.args = args
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
782 self.stdin = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
783 self.stdout = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
784 self.stderr = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785 self.pid = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
786 self.returncode = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
787 self.universal_newlines = universal_newlines
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
788
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789 # Input and output objects. The general principle is like
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
790 # this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
792 # Parent Child
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
793 # ------ -----
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
794 # p2cwrite ---stdin---> p2cread
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
795 # c2pread <--stdout--- c2pwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
796 # errread <--stderr--- errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
797 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
798 # On POSIX, the child objects are file descriptors. On
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
799 # Windows, these are Windows file handles. The parent objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
800 # are file descriptors on both platforms. The parent objects
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
801 # are -1 when not using PIPEs. The child objects are -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
802 # when not redirecting.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
803
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
805 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
806 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
807
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
808 # We wrap OS handles *before* launching the child, otherwise a
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
809 # quickly terminating child could make our fds unwrappable
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
810 # (see #8458).
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
811
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40775
diff changeset
812 if mswindows:
59619
c45f21705ecb Fix an oversight in r78946 which causes failure in the subprocess module on Windows.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59613
diff changeset
813 if p2cwrite != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
814 p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
59619
c45f21705ecb Fix an oversight in r78946 which causes failure in the subprocess module on Windows.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59613
diff changeset
815 if c2pread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
816 c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
59619
c45f21705ecb Fix an oversight in r78946 which causes failure in the subprocess module on Windows.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59613
diff changeset
817 if errread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
818 errread = msvcrt.open_osfhandle(errread.Detach(), 0)
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40775
diff changeset
819
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
820 if p2cwrite != -1:
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
821 self.stdin = io.open(p2cwrite, 'wb', bufsize)
78590
65ef6ae39ea3 Cleanup universal_newlines usage for subprocess.Popen, remove unused param.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78572
diff changeset
822 if universal_newlines:
71485
5cc536fbd7c1 Issue #12591: Improve support of "universal newlines" in the subprocess
Antoine Pitrou <solipsis@pitrou.net>
parents: 71228
diff changeset
823 self.stdin = io.TextIOWrapper(self.stdin, write_through=True)
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
824 if c2pread != -1:
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
825 self.stdout = io.open(c2pread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
826 if universal_newlines:
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
827 self.stdout = io.TextIOWrapper(self.stdout)
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
828 if errread != -1:
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
829 self.stderr = io.open(errread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
830 if universal_newlines:
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
831 self.stderr = io.TextIOWrapper(self.stderr)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
832
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
833 self._closed_child_pipe_fds = False
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
834 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
835 self._execute_child(args, executable, preexec_fn, close_fds,
78590
65ef6ae39ea3 Cleanup universal_newlines usage for subprocess.Popen, remove unused param.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78572
diff changeset
836 pass_fds, cwd, env,
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
837 startupinfo, creationflags, shell,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
838 p2cread, p2cwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
839 c2pread, c2pwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
840 errread, errwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
841 restore_signals, start_new_session)
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
842 except:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
843 # Cleanup if the child failed starting.
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
844 for f in filter(None, (self.stdin, self.stdout, self.stderr)):
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
845 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
846 f.close()
80922
061e9a439f54 Get rig of EnvironmentError (#16705)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80920
diff changeset
847 except OSError:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
848 pass # Ignore EBADF or other errors.
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
849
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
850 if not self._closed_child_pipe_fds:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
851 to_close = []
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
852 if stdin == PIPE:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
853 to_close.append(p2cread)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
854 if stdout == PIPE:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
855 to_close.append(c2pwrite)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
856 if stderr == PIPE:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
857 to_close.append(errwrite)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
858 if hasattr(self, '_devnull'):
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
859 to_close.append(self._devnull)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
860 for fd in to_close:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
861 try:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
862 os.close(fd)
84162
7dee56b6ff34 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 84114 84160
diff changeset
863 except OSError:
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
864 pass
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
865
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
866 raise
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
867
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
868
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
869 def _translate_newlines(self, data, encoding):
78655
a0f7c2f79bce Issue #15595: Fix subprocess.Popen(universal_newlines=True)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 75524
diff changeset
870 data = data.decode(encoding)
a0f7c2f79bce Issue #15595: Fix subprocess.Popen(universal_newlines=True)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 75524
diff changeset
871 return data.replace("\r\n", "\n").replace("\r", "\n")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
872
66622
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
873 def __enter__(self):
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
874 return self
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
875
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
876 def __exit__(self, type, value, traceback):
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
877 if self.stdout:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
878 self.stdout.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
879 if self.stderr:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
880 self.stderr.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
881 if self.stdin:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
882 self.stdin.close()
70049
b00a64a5cb93 merge - 7a3f3ad83676 Fixes Issue #12044.
Gregory P. Smith <greg@krypto.org>
parents: 69690
diff changeset
883 # Wait for the process to terminate, to avoid zombies.
b00a64a5cb93 merge - 7a3f3ad83676 Fixes Issue #12044.
Gregory P. Smith <greg@krypto.org>
parents: 69690
diff changeset
884 self.wait()
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
885
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
886 def __del__(self, _maxsize=sys.maxsize, _active=_active):
70554
0f2714e49583 Close #12085: Fix an attribute error in subprocess.Popen destructor if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70050
diff changeset
887 # If __init__ hasn't had a chance to execute (e.g. if it
0f2714e49583 Close #12085: Fix an attribute error in subprocess.Popen destructor if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70050
diff changeset
888 # was passed an undeclared keyword argument), we don't
0f2714e49583 Close #12085: Fix an attribute error in subprocess.Popen destructor if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70050
diff changeset
889 # have a _child_created attribute at all.
0f2714e49583 Close #12085: Fix an attribute error in subprocess.Popen destructor if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70050
diff changeset
890 if not getattr(self, '_child_created', False):
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
891 # We didn't get to successfully create a child process.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
892 return
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
893 # In case the child hasn't been waited on, check if it's done.
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
894 self._internal_poll(_deadstate=_maxsize)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
895 if self.returncode is None and _active is not None:
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
896 # Child is still running, keep us alive until we can wait on it.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
897 _active.append(self)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
898
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
899 def _get_devnull(self):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
900 if not hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
901 self._devnull = os.open(os.devnull, os.O_RDWR)
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
902 return self._devnull
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
903
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
904 def communicate(self, input=None, timeout=None):
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
905 """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
906 stdout and stderr, until end-of-file is reached. Wait for
70289
6354b4ceba1d Update documentation to mention bytes instead byte string and correct one
Gregory P. Smith <greg@krypto.org>
parents: 70052
diff changeset
907 process to terminate. The optional input argument should be
6354b4ceba1d Update documentation to mention bytes instead byte string and correct one
Gregory P. Smith <greg@krypto.org>
parents: 70052
diff changeset
908 bytes to be sent to the child process, or None, if no data
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
909 should be sent to the child.
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
910
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
911 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
912
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
913 if self._communication_started and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
914 raise ValueError("Cannot send input after starting communication")
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
915
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
916 # Optimization: If we are not worried about timeouts, we haven't
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
917 # started communicating, and we have one or zero pipes, using select()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
918 # or threads is unnecessary.
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
919 if (timeout is None and not self._communication_started and
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
920 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
921 stdout = None
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
922 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
923 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
924 if input:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
925 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
926 self.stdin.write(input)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81021
diff changeset
927 except OSError as e:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
928 if e.errno != errno.EPIPE and e.errno != errno.EINVAL:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
929 raise
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
930 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
931 elif self.stdout:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
932 stdout = _eintr_retry_call(self.stdout.read)
47557
98827a21e352 Merged revisions 63724,63726,63732,63744,63754-63755,63757-63758,63760,63775,63781-63782,63787,63805-63808,63818-63819,63823-63824 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47331
diff changeset
933 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
934 elif self.stderr:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
935 stderr = _eintr_retry_call(self.stderr.read)
47557
98827a21e352 Merged revisions 63724,63726,63732,63744,63754-63755,63757-63758,63760,63775,63781-63782,63787,63805-63808,63818-63819,63823-63824 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47331
diff changeset
936 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
937 self.wait()
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
938 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
939 if timeout is not None:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
940 endtime = _time() + timeout
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
941 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
942 endtime = None
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
943
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
944 try:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
945 stdout, stderr = self._communicate(input, endtime, timeout)
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
946 finally:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
947 self._communication_started = True
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
948
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
949 sts = self.wait(timeout=self._remaining_time(endtime))
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
950
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
951 return (stdout, stderr)
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
952
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
953
48680
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
954 def poll(self):
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
955 return self._internal_poll()
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
956
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
957
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
958 def _remaining_time(self, endtime):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
959 """Convenience for _communicate when computing timeouts."""
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
960 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
961 return None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
962 else:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
963 return endtime - _time()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
964
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
965
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
966 def _check_timeout(self, endtime, orig_timeout):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
967 """Convenience for checking if a timeout has expired."""
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
968 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
969 return
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
970 if _time() > endtime:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
971 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
972
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
973
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
974 if mswindows:
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 # Windows methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
977 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 def _get_handles(self, stdin, stdout, stderr):
55617
a267c604465f Recorded merge of revisions 74057 via svnmerge from
Georg Brandl <georg@python.org>
parents: 55602
diff changeset
979 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
981 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
982 if stdin is None and stdout is None and stderr is None:
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
983 return (-1, -1, -1, -1, -1, -1)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
984
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
985 p2cread, p2cwrite = -1, -1
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
986 c2pread, c2pwrite = -1, -1
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
987 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
988
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
989 if stdin is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
990 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
991 if p2cread is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
992 p2cread, _ = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
993 p2cread = Handle(p2cread)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
994 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
995 elif stdin == PIPE:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
996 p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
997 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
998 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
999 p2cread = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1000 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1001 p2cread = msvcrt.get_osfhandle(stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1002 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1003 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1004 p2cread = msvcrt.get_osfhandle(stdin.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1005 p2cread = self._make_inheritable(p2cread)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1006
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1007 if stdout is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1008 c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1009 if c2pwrite is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1010 _, c2pwrite = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1011 c2pwrite = Handle(c2pwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1012 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1013 elif stdout == PIPE:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1014 c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1015 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1016 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1017 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1018 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1019 c2pwrite = msvcrt.get_osfhandle(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1020 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1021 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1022 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023 c2pwrite = self._make_inheritable(c2pwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1024
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1025 if stderr is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1026 errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1027 if errwrite is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1028 _, errwrite = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1029 errwrite = Handle(errwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1030 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1031 elif stderr == PIPE:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1032 errread, errwrite = _winapi.CreatePipe(None, 0)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1033 errread, errwrite = Handle(errread), Handle(errwrite)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1035 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1036 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1037 errwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1038 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1039 errwrite = msvcrt.get_osfhandle(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1040 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1041 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1042 errwrite = msvcrt.get_osfhandle(stderr.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1043 errwrite = self._make_inheritable(errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1044
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1045 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1046 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1047 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1048
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1049
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1050 def _make_inheritable(self, handle):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1051 """Return a duplicate of handle, which is inheritable"""
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1052 h = _winapi.DuplicateHandle(
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1053 _winapi.GetCurrentProcess(), handle,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1054 _winapi.GetCurrentProcess(), 0, 1,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1055 _winapi.DUPLICATE_SAME_ACCESS)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1056 return Handle(h)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1057
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1058
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1059 def _execute_child(self, args, executable, preexec_fn, close_fds,
78590
65ef6ae39ea3 Cleanup universal_newlines usage for subprocess.Popen, remove unused param.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78572
diff changeset
1060 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1061 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1062 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1063 c2pread, c2pwrite,
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1064 errread, errwrite,
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1065 unused_restore_signals, unused_start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1066 """Execute program (MS Windows version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1067
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
1068 assert not pass_fds, "pass_fds not supported on Windows."
66692
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1069
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43487
diff changeset
1070 if not isinstance(args, str):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1071 args = list2cmdline(args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1072
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
1073 # Process startup details
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1074 if startupinfo is None:
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1075 startupinfo = STARTUPINFO()
61793
441491572fce Issue #8780: Fix a regression introduced by r78946 in subprocess on Windows
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61693
diff changeset
1076 if -1 not in (p2cread, c2pwrite, errwrite):
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1077 startupinfo.dwFlags |= _winapi.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
1078 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
1079 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
1080 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
1081
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1082 if shell:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1083 startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1084 startupinfo.wShowWindow = _winapi.SW_HIDE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1085 comspec = os.environ.get("COMSPEC", "cmd.exe")
63930
8499ae5d9719 #2304: fix incorporating Eric Smith's .format suggestion and tested on Ubuntu as well as Windows
Tim Golden <mail@timgolden.me.uk>
parents: 63843
diff changeset
1086 args = '{} /c "{}"'.format (comspec, args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1087
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088 # Start the process
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1090 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1091 # no special security
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1092 None, None,
41969
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41845
diff changeset
1093 int(not close_fds),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1094 creationflags,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1095 env,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1096 cwd,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1097 startupinfo)
63816
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1098 finally:
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1099 # Child is launched. Close the parent's copy of those pipe
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1100 # handles that only the child should have open. You need
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1101 # to make sure that no handles to the write end of the
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1102 # output pipe are maintained in this process or else the
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1103 # pipe will not close when the child process exits and the
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1104 # ReadFile will hang.
63815
e41ca6672f82 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63094
diff changeset
1105 if p2cread != -1:
63816
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1106 p2cread.Close()
63815
e41ca6672f82 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63094
diff changeset
1107 if c2pwrite != -1:
63816
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1108 c2pwrite.Close()
63815
e41ca6672f82 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63094
diff changeset
1109 if errwrite != -1:
63816
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1110 errwrite.Close()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1111 if hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1112 os.close(self._devnull)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1114 # Retain the process handle, but close the thread handle
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
1115 self._child_created = True
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1116 self._handle = Handle(hp)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117 self.pid = pid
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1118 _winapi.CloseHandle(ht)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1119
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1120 def _internal_poll(self, _deadstate=None,
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1121 _WaitForSingleObject=_winapi.WaitForSingleObject,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1122 _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1123 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1124 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1125 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1126
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1127 This method is called by __del__, so it can only refer to objects
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1128 in its local scope.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1129
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1130 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1131 if self.returncode is None:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1132 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1133 self.returncode = _GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1135
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1136
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1137 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1138 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1139 attribute."""
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1140 if endtime is not None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1141 timeout = self._remaining_time(endtime)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1142 if timeout is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1143 timeout_millis = _winapi.INFINITE
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1144 else:
68807
ab2363f89058 Fix timeout error message on windows to not be in milliseconds.
Reid Kleckner <reid@kleckner.net>
parents: 68750
diff changeset
1145 timeout_millis = int(timeout * 1000)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1146 if self.returncode is None:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1147 result = _winapi.WaitForSingleObject(self._handle,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1148 timeout_millis)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1149 if result == _winapi.WAIT_TIMEOUT:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1150 raise TimeoutExpired(self.args, timeout)
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1151 self.returncode = _winapi.GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1152 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1155 def _readerthread(self, fh, buffer):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 buffer.append(fh.read())
67130
38d66980187e Issue #10763: subprocess.communicate() closes stdout and stderr if both are
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66893
diff changeset
1157 fh.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1158
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1159
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1160 def _communicate(self, input, endtime, orig_timeout):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1161 # Start reader threads feeding into a list hanging off of this
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1162 # object, unless they've already been started.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1163 if self.stdout and not hasattr(self, "_stdout_buff"):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1164 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1165 self.stdout_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1166 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1167 args=(self.stdout, self._stdout_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1168 self.stdout_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1169 self.stdout_thread.start()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1170 if self.stderr and not hasattr(self, "_stderr_buff"):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1171 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1172 self.stderr_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1173 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1174 args=(self.stderr, self._stderr_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1175 self.stderr_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1176 self.stderr_thread.start()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1177
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1178 if self.stdin:
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1179 if input is not None:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1180 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1181 self.stdin.write(input)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81021
diff changeset
1182 except OSError as e:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1183 if e.errno != errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1184 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1185 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1186
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1187 # Wait for the reader threads, or time out. If we time out, the
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1188 # threads remain reading and the fds left open in case the user
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1189 # calls communicate again.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1190 if self.stdout is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1191 self.stdout_thread.join(self._remaining_time(endtime))
78654
882da270d21a Use Thread.is_alive() instead of old-style Thread.isAlive() in subprocess.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78590
diff changeset
1192 if self.stdout_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1193 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1194 if self.stderr is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1195 self.stderr_thread.join(self._remaining_time(endtime))
78654
882da270d21a Use Thread.is_alive() instead of old-style Thread.isAlive() in subprocess.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78590
diff changeset
1196 if self.stderr_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1197 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1198
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1199 # Collect the output from and close both pipes, now that we know
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1200 # both have been read successfully.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1201 stdout = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1202 stderr = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1203 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1204 stdout = self._stdout_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1205 self.stdout.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1206 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1207 stderr = self._stderr_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1208 self.stderr.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1209
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1210 # All data exchanged. Translate lists into strings.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1211 if stdout is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1212 stdout = stdout[0]
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1213 if stderr is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1214 stderr = stderr[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1215
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1216 return (stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1217
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1218 def send_signal(self, sig):
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1219 """Send a signal to the process
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1220 """
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1221 if sig == signal.SIGTERM:
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1222 self.terminate()
60556
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1223 elif sig == signal.CTRL_C_EVENT:
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1224 os.kill(self.pid, signal.CTRL_C_EVENT)
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1225 elif sig == signal.CTRL_BREAK_EVENT:
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1226 os.kill(self.pid, signal.CTRL_BREAK_EVENT)
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1227 else:
64518
1a1e7254d965 Adjust #8956 to add the bad signal number to the exception message.
Brian Curtin <brian.curtin@gmail.com>
parents: 64493
diff changeset
1228 raise ValueError("Unsupported signal: {}".format(sig))
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1229
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1230 def terminate(self):
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1231 """Terminates the process
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1232 """
75524
41b1fe5a75a6 Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71903
diff changeset
1233 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1234 _winapi.TerminateProcess(self._handle, 1)
75525
f452d7d5470d Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73085 75524
diff changeset
1235 except PermissionError:
75524
41b1fe5a75a6 Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71903
diff changeset
1236 # ERROR_ACCESS_DENIED (winerror 5) is received when the
41b1fe5a75a6 Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71903
diff changeset
1237 # process already died.
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1238 rc = _winapi.GetExitCodeProcess(self._handle)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1239 if rc == _winapi.STILL_ACTIVE:
75524
41b1fe5a75a6 Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71903
diff changeset
1240 raise
41b1fe5a75a6 Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under Windows when the child process has already exited.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71903
diff changeset
1241 self.returncode = rc
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1242
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1243 kill = terminate
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1244
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1245 else:
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 # POSIX methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1249 def _get_handles(self, stdin, stdout, stderr):
55617
a267c604465f Recorded merge of revisions 74057 via svnmerge from
Georg Brandl <georg@python.org>
parents: 55602
diff changeset
1250 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252 """
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1253 p2cread, p2cwrite = -1, -1
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1254 c2pread, c2pwrite = -1, -1
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1255 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1256
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1257 if stdin is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1258 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259 elif stdin == PIPE:
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85222
diff changeset
1260 p2cread, p2cwrite = os.pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1261 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1262 p2cread = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1263 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264 p2cread = stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1265 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 p2cread = stdin.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1269 if stdout is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1270 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271 elif stdout == PIPE:
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85222
diff changeset
1272 c2pread, c2pwrite = os.pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1273 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1274 c2pwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1275 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1276 c2pwrite = stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1277 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1278 # Assuming file-like object
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1279 c2pwrite = stdout.fileno()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1280
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1281 if stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1282 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283 elif stderr == PIPE:
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85222
diff changeset
1284 errread, errwrite = os.pipe()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1286 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1287 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1288 errwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1289 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1290 errwrite = stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1292 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293 errwrite = stderr.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1294
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1295 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1296 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1297 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1299
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1300 def _close_fds(self, fds_to_keep):
66692
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1301 start_fd = 3
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1302 for fd in sorted(fds_to_keep):
66889
59b43dc34158 Issue #6559: fix the subprocess.Popen pass_fds implementation. Add a unittest.
Gregory P. Smith <greg@mad-scientist.com>
parents: 66868
diff changeset
1303 if fd >= start_fd:
66692
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1304 os.closerange(start_fd, fd)
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1305 start_fd = fd + 1
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1306 if start_fd <= MAXFD:
296e6f85f56d issue6559: Adds a pass_fds parameter to subprocess.Popen that allows the caller
Gregory P. Smith <greg@mad-scientist.com>
parents: 66676
diff changeset
1307 os.closerange(start_fd, MAXFD)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1308
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1309
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1310 def _execute_child(self, args, executable, preexec_fn, close_fds,
78590
65ef6ae39ea3 Cleanup universal_newlines usage for subprocess.Popen, remove unused param.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 78572
diff changeset
1311 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1312 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1314 c2pread, c2pwrite,
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1315 errread, errwrite,
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1316 restore_signals, start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1317 """Execute program (POSIX version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1318
68214
738feec9ced0 Issue #8513: On UNIX, subprocess supports bytes command string.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67358
diff changeset
1319 if isinstance(args, (str, bytes)):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1320 args = [args]
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1321 else:
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1322 args = list(args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1323
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1324 if shell:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1325 args = ["/bin/sh", "-c"] + args
63095
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1326 if executable:
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1327 args[0] = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1328
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1329 if executable is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1330 executable = args[0]
79632
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1331 orig_executable = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1332
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1333 # For transferring possible exec failure from child to parent.
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1334 # Data format: "exception name:hex errno:description"
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1335 # Pickle is not used; it is complex and involves memory allocation.
85420
ef889c3d5dc6 Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents: 85222
diff changeset
1336 errpipe_read, errpipe_write = os.pipe()
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
1337 try:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1338 try:
70467
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1339 # We must avoid complex work that could involve
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1340 # malloc or free in the child process to avoid
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1341 # potential deadlocks, thus we do all this here.
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1342 # and pass it to fork_exec()
71524
1140b32747c9 Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 71485
diff changeset
1343
70922
10ecf8576eb2 (merge 3.2) Close #12383: Fix subprocess module with env={}: don't copy the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70555 70921
diff changeset
1344 if env is not None:
70467
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1345 env_list = [os.fsencode(k) + b'=' + os.fsencode(v)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1346 for k, v in env.items()]
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1347 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1348 env_list = None # Use execv instead of execve.
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1349 executable = os.fsencode(executable)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1350 if os.path.dirname(executable):
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1351 executable_list = (executable,)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1352 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1353 # This matches the behavior of os._execvpe().
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1354 executable_list = tuple(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1355 os.path.join(os.fsencode(dir), executable)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1356 for dir in os.get_exec_path(env))
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1357 fds_to_keep = set(pass_fds)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1358 fds_to_keep.add(errpipe_write)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1359 self.pid = _posixsubprocess.fork_exec(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1360 args, executable_list,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1361 close_fds, sorted(fds_to_keep), cwd, env_list,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1362 p2cread, p2cwrite, c2pread, c2pwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1363 errread, errwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1364 errpipe_read, errpipe_write,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1365 restore_signals, start_new_session, preexec_fn)
71904
148d75d106f1 Issue #12650: Fix a race condition where a subprocess.Popen could leak
Charles-François Natali <neologix@free.fr>
parents: 71525 71903
diff changeset
1366 self._child_created = True
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1367 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1368 # be sure the FD is closed no matter what
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1369 os.close(errpipe_write)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1370
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1371 # self._devnull is not always defined.
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1372 devnull_fd = getattr(self, '_devnull', None)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1373 if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1374 os.close(p2cread)
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1375 if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1376 os.close(c2pwrite)
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1377 if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1378 os.close(errwrite)
84160
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1379 if devnull_fd is not None:
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1380 os.close(devnull_fd)
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1381 # Prevent a double close of these fds from __init__ on error.
be08c8b8c574 Prevent a possible double close of parent pipe fds when the subprocess
Gregory P. Smith <greg@krypto.org>
parents: 82917
diff changeset
1382 self._closed_child_pipe_fds = True
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1383
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1384 # Wait for exec to fail or succeed; possibly raising an
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1385 # exception (limited in size)
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1386 errpipe_data = bytearray()
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1387 while True:
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1388 part = _eintr_retry_call(os.read, errpipe_read, 50000)
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1389 errpipe_data += part
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1390 if not part or len(errpipe_data) > 50000:
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1391 break
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1392 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1393 # be sure the FD is closed no matter what
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1394 os.close(errpipe_read)
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1395
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1396 if errpipe_data:
66895
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1397 try:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1398 _eintr_retry_call(os.waitpid, self.pid, 0)
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1399 except OSError as e:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1400 if e.errno != errno.ECHILD:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1401 raise
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1402 try:
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1403 exception_name, hex_errno, err_msg = (
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1404 errpipe_data.split(b':', 2))
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1405 except ValueError:
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1406 exception_name = b'SubprocessError'
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1407 hex_errno = b'0'
80376
bbfff05ed34f Remove the subprocess "bad exception data" warning (formerly a print!)
Gregory P. Smith <greg@krypto.org>
parents: 80372
diff changeset
1408 err_msg = (b'Bad exception data from child: ' +
bbfff05ed34f Remove the subprocess "bad exception data" warning (formerly a print!)
Gregory P. Smith <greg@krypto.org>
parents: 80372
diff changeset
1409 repr(errpipe_data))
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1410 child_exception_type = getattr(
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1411 builtins, exception_name.decode('ascii'),
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1412 SubprocessError)
60896
8428eaa2d3ad Issue #8467: Pure Python implementation of subprocess encodes the error message
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60556
diff changeset
1413 err_msg = err_msg.decode(errors="surrogatepass")
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1414 if issubclass(child_exception_type, OSError) and hex_errno:
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1415 errno_num = int(hex_errno, 16)
79632
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1416 child_exec_never_called = (err_msg == "noexec")
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1417 if child_exec_never_called:
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1418 err_msg = ""
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1419 if errno_num != 0:
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1420 err_msg = os.strerror(errno_num)
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1421 if errno_num == errno.ENOENT:
79632
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1422 if child_exec_never_called:
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1423 # The error must be from chdir(cwd).
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1424 err_msg += ': ' + repr(cwd)
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1425 else:
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1426 err_msg += ': ' + repr(orig_executable)
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1427 raise child_exception_type(errno_num, err_msg)
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1428 raise child_exception_type(err_msg)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1429
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1430
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1431 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1432 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1433 _WEXITSTATUS=os.WEXITSTATUS):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1434 # This method is called (indirectly) by __del__, so it cannot
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1435 # refer to anything outside of its local scope."""
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1436 if _WIFSIGNALED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1437 self.returncode = -_WTERMSIG(sts)
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1438 elif _WIFEXITED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1439 self.returncode = _WEXITSTATUS(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1440 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1441 # Should never happen
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1442 raise SubprocessError("Unknown child exit status!")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1443
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1444
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1445 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
81021
8f30461395b1 Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81005 81020
diff changeset
1446 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1447 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1448 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1449
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1450 This method is called by __del__, so it cannot reference anything
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1451 outside of the local scope (nor can any methods it calls).
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1452
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1453 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1454 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1455 try:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1456 pid, sts = _waitpid(self.pid, _WNOHANG)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1457 if pid == self.pid:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1458 self._handle_exitstatus(sts)
80932
47f98a550d42 Issue #16706: get rid of os.error
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80922
diff changeset
1459 except OSError as e:
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
1460 if _deadstate is not None:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
1461 self.returncode = _deadstate
81019
0cc4fe5634cf Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80379
diff changeset
1462 elif e.errno == _ECHILD:
79266
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1463 # This happens if SIGCLD is set to be ignored or
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1464 # waiting for child processes has otherwise been
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1465 # disabled for our process. This child is dead, we
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1466 # can't get the status.
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1467 # http://bugs.python.org/issue15756
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1468 self.returncode = 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1469 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1470
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1471
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1472 def _try_wait(self, wait_flags):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1473 try:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1474 (pid, sts) = _eintr_retry_call(os.waitpid, self.pid, wait_flags)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1475 except OSError as e:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1476 if e.errno != errno.ECHILD:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1477 raise
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1478 # This happens if SIGCLD is set to be ignored or waiting
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1479 # for child processes has otherwise been disabled for our
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1480 # process. This child is dead, we can't get the status.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1481 pid = self.pid
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1482 sts = 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1483 return (pid, sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1484
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1485
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1486 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1487 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1488 attribute."""
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1489 if self.returncode is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1490 return self.returncode
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1491
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1492 # endtime is preferred to timeout. timeout is only used for
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1493 # printing.
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1494 if endtime is not None or timeout is not None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1495 if endtime is None:
77243
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
1496 endtime = _time() + timeout
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1497 elif timeout is None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1498 timeout = self._remaining_time(endtime)
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1499
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1500 if endtime is not None:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1501 # Enter a busy loop if we have a timeout. This busy loop was
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1502 # cribbed from Lib/threading.py in Thread.wait() at r71065.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1503 delay = 0.0005 # 500 us -> initial delay of 1 ms
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1504 while True:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1505 (pid, sts) = self._try_wait(os.WNOHANG)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1506 assert pid == self.pid or pid == 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1507 if pid == self.pid:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1508 self._handle_exitstatus(sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1509 break
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1510 remaining = self._remaining_time(endtime)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1511 if remaining <= 0:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1512 raise TimeoutExpired(self.args, timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1513 delay = min(delay * 2, remaining, .05)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1514 time.sleep(delay)
80363
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1515 else:
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1516 while self.returncode is None:
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1517 (pid, sts) = self._try_wait(0)
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1518 # Check the pid and loop as waitpid has been known to return
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1519 # 0 even without WNOHANG in odd situations. issue14396.
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1520 if pid == self.pid:
61a0eace0f2e Fixes issue #14396: Handle the odd rare case of waitpid returning 0
Gregory P. Smith <greg@krypto.org>
parents: 79633 80362
diff changeset
1521 self._handle_exitstatus(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1522 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1523
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1524
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1525 def _communicate(self, input, endtime, orig_timeout):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1526 if self.stdin and not self._communication_started:
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1527 # Flush stdio buffer. This might block, if the user has
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1528 # been writing to .stdin in an uncontrolled fashion.
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1529 self.stdin.flush()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1530 if not input:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1531 self.stdin.close()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1532
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1533 if _has_poll:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1534 stdout, stderr = self._communicate_with_poll(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1535 orig_timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1536 else:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1537 stdout, stderr = self._communicate_with_select(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1538 orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1539
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1540 self.wait(timeout=self._remaining_time(endtime))
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1541
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1542 # All data exchanged. Translate lists into strings.
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1543 if stdout is not None:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1544 stdout = b''.join(stdout)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1545 if stderr is not None:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1546 stderr = b''.join(stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1547
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1548 # Translate newlines, if requested.
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1549 # This also turns bytes into strings.
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1550 if self.universal_newlines:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1551 if stdout is not None:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1552 stdout = self._translate_newlines(stdout,
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1553 self.stdout.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1554 if stderr is not None:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1555 stderr = self._translate_newlines(stderr,
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1556 self.stderr.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1557
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1558 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1559
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1560
78572
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1561 def _save_input(self, input):
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1562 # This method is called from the _communicate_with_*() methods
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1563 # so that if we time out while communicating, we can continue
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1564 # sending input if we retry.
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1565 if self.stdin and self._input is None:
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1566 self._input_offset = 0
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1567 self._input = input
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1568 if self.universal_newlines and input is not None:
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1569 self._input = self._input.encode(self.stdin.encoding)
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1570
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1571
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1572 def _communicate_with_poll(self, input, endtime, orig_timeout):
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1573 stdout = None # Return
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1574 stderr = None # Return
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1575
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1576 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1577 self._fd2file = {}
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1578
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1579 poller = select.poll()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1580 def register_and_append(file_obj, eventmask):
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1581 poller.register(file_obj.fileno(), eventmask)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1582 self._fd2file[file_obj.fileno()] = file_obj
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1583
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1584 def close_unregister_and_remove(fd):
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1585 poller.unregister(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1586 self._fd2file[fd].close()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1587 self._fd2file.pop(fd)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1588
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1589 if self.stdin and input:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1590 register_and_append(self.stdin, select.POLLOUT)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1591
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1592 # Only create this mapping if we haven't already.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1593 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1594 self._fd2output = {}
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1595 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1596 self._fd2output[self.stdout.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1597 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1598 self._fd2output[self.stderr.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1599
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1600 select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1601 if self.stdout:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1602 register_and_append(self.stdout, select_POLLIN_POLLPRI)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1603 stdout = self._fd2output[self.stdout.fileno()]
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1604 if self.stderr:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1605 register_and_append(self.stderr, select_POLLIN_POLLPRI)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1606 stderr = self._fd2output[self.stderr.fileno()]
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1607
78572
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1608 self._save_input(input)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1609
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1610 while self._fd2file:
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1611 timeout = self._remaining_time(endtime)
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1612 if timeout is not None and timeout < 0:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1613 raise TimeoutExpired(self.args, orig_timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1614 try:
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1615 ready = poller.poll(timeout)
80920
eb8032781eba Issue #16704: Get rid of select.error in stdlib. Use OSError instead.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80909
diff changeset
1616 except OSError as e:
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1617 if e.args[0] == errno.EINTR:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1618 continue
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1619 raise
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1620 self._check_timeout(endtime, orig_timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1621
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1622 # XXX Rewrite these to use non-blocking I/O on the
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1623 # file objects; they are no longer using C stdio!
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1624
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1625 for fd, mode in ready:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1626 if mode & select.POLLOUT:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1627 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1628 self._input_offset + _PIPE_BUF]
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1629 try:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1630 self._input_offset += os.write(fd, chunk)
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1631 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1632 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1633 close_unregister_and_remove(fd)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1634 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1635 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1636 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1637 if self._input_offset >= len(self._input):
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1638 close_unregister_and_remove(fd)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1639 elif mode & select_POLLIN_POLLPRI:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1640 data = os.read(fd, 4096)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1641 if not data:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1642 close_unregister_and_remove(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1643 self._fd2output[fd].append(data)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1644 else:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1645 # Ignore hang up or errors.
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1646 close_unregister_and_remove(fd)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1647
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1648 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1649
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1650
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1651 def _communicate_with_select(self, input, endtime, orig_timeout):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1652 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1653 self._read_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1654 self._write_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1655 if self.stdin and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1656 self._write_set.append(self.stdin)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1657 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1658 self._read_set.append(self.stdout)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1659 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1660 self._read_set.append(self.stderr)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1661
78572
9d86480cc177 Issue #15592. Fix regression: subprocess.communicate() breaks on no input with universal newlines true.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77243
diff changeset
1662 self._save_input(input)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1663
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1664 stdout = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1665 stderr = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1666
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1667 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1668 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1669 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1670 stdout = self._stdout_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1671 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1672 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1673 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1674 stderr = self._stderr_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1675
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1676 while self._read_set or self._write_set:
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1677 timeout = self._remaining_time(endtime)
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1678 if timeout is not None and timeout < 0:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1679 raise TimeoutExpired(self.args, orig_timeout)
48494
aca5b2e6a66f Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48395
diff changeset
1680 try:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1681 (rlist, wlist, xlist) = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1682 select.select(self._read_set, self._write_set, [],
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1683 timeout)
80920
eb8032781eba Issue #16704: Get rid of select.error in stdlib. Use OSError instead.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80909
diff changeset
1684 except OSError as e:
48494
aca5b2e6a66f Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48395
diff changeset
1685 if e.args[0] == errno.EINTR:
aca5b2e6a66f Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48395
diff changeset
1686 continue
aca5b2e6a66f Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48395
diff changeset
1687 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1688
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1689 # According to the docs, returning three empty lists indicates
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1690 # that the timeout expired.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1691 if not (rlist or wlist or xlist):
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1692 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1693 # We also check what time it is ourselves for good measure.
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1694 self._check_timeout(endtime, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1695
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
1696 # XXX Rewrite these to use non-blocking I/O on the
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
1697 # file objects; they are no longer using C stdio!
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
1698
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1699 if self.stdin in wlist:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1700 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1701 self._input_offset + _PIPE_BUF]
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1702 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1703 bytes_written = os.write(self.stdin.fileno(), chunk)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1704 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1705 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1706 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1707 self._write_set.remove(self.stdin)
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1708 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1709 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1710 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1711 self._input_offset += bytes_written
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1712 if self._input_offset >= len(self._input):
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1713 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1714 self._write_set.remove(self.stdin)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1715
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1716 if self.stdout in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1717 data = os.read(self.stdout.fileno(), 1024)
41732
bbb099d4ec80 Make test_subprocess pass. The subprocess module now reads and writes
Guido van Rossum <guido@python.org>
parents: 41731
diff changeset
1718 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1719 self.stdout.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1720 self._read_set.remove(self.stdout)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1721 stdout.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1722
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1723 if self.stderr in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1724 data = os.read(self.stderr.fileno(), 1024)
41732
bbb099d4ec80 Make test_subprocess pass. The subprocess module now reads and writes
Guido van Rossum <guido@python.org>
parents: 41731
diff changeset
1725 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1726 self.stderr.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1727 self._read_set.remove(self.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1728 stderr.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1729
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1730 return (stdout, stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1731
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1732
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1733 def send_signal(self, sig):
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1734 """Send a signal to the process
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1735 """
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1736 os.kill(self.pid, sig)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1737
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1738 def terminate(self):
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1739 """Terminate the process with SIGTERM
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1740 """
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1741 self.send_signal(signal.SIGTERM)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1742
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1743 def kill(self):
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1744 """Kill the process with SIGKILL
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1745 """
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1746 self.send_signal(signal.SIGKILL)