annotate Lib/subprocess.py @ 83447:678564fc0962 3.3

#17789: test_random now works with unittest test discovery. Patch by Zachary Ware.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 19 Apr 2013 05:45:27 +0300
parents 4c2fc172afcc
children be08c8b8c574 3031d69f94ef
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
107 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
108 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
109 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
110 '\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
111 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
112 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
113 communicate() method.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
114
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
115 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
116 underlying CreateProcess() function. They can specify things such as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
117 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
118 (Windows only)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
119
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
120
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
121 This module also defines some shortcut functions:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
122
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
123 call(*popenargs, **kwargs):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
124 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
125 return the returncode attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
126
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
127 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
128
59471
ac80884ddcc3 Merged revisions 78736,78759,78761,78767,78788-78789 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59207
diff changeset
129 >>> retcode = subprocess.call(["ls", "-l"])
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
130
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
131 check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
132 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
133 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
134 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
135 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
136
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
137 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
138
59471
ac80884ddcc3 Merged revisions 78736,78759,78761,78767,78788-78789 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59207
diff changeset
139 >>> 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
140 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
141
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
142 getstatusoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
143 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
144
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
145 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
146 (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
147 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
148 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
149 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
150
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
151 >>> 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
152 (0, '/bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
153 >>> 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
154 (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
155 >>> subprocess.getstatusoutput('/bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
156 (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
157
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
158 getoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
159 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
160
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
161 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
162 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
163
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
164 >>> 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
165 '/bin/ls'
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
166
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
167 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
168 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
169
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
170 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
171 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
172 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
173
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
174 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
175
65109
a68f8763555b Merged revisions 76923,76926,77009,77082-77083,77085,77087,77121 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63930
diff changeset
176 >>> 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
177
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
178
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
179 Exceptions
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
180 ----------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
181 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
182 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
183 the exception object will have one extra attribute called
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
184 'child_traceback', which is a string containing traceback information
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
185 from the childs point of view.
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 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
188 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
189 should prepare for OSErrors.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
190
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
191 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
192
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
193 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
194 check_call() and check_output() will raise CalledProcessError if the
68465
bffe5809bfda whitespace fix
Gregory P. Smith <greg@krypto.org>
parents: 68463
diff changeset
195 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
196 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
197
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
198
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
199 Security
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
200 --------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
201 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
202 /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
203 metacharacters, can safely be passed to child processes.
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
206 Popen objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
207 =============
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
208 Instances of the Popen class have the following methods:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
209
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 poll()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
211 Check if child process has terminated. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
212 attribute.
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 wait()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
215 Wait for child process to terminate. Returns returncode attribute.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
216
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217 communicate(input=None)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
218 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
219 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
220 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
221 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
222 the child.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
223
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
224 communicate() returns a tuple (stdout, stderr).
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
225
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
226 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
227 method if the data size is large or unlimited.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
228
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
229 The following attributes are also available:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
230
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
231 stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
232 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
233 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
234
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
235 stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
236 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
237 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
238 None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
239
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
240 stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
241 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
242 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
243 None.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
244
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
245 pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
246 The process ID of the child process.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
247
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
248 returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
249 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
250 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
251 child was terminated by signal N (POSIX only).
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252
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 Replacing older functions with the subprocess module
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255 ====================================================
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
256 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
257 for a.
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 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
260 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
261 exception.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
262
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
263 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
264 imported with "from subprocess import *".
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
265
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
266
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
267 Replacing /bin/sh shell backquote
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 output=`mycmd myarg`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
270 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
271 output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
274 Replacing shell pipe line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
275 -------------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
276 output=`dmesg | grep hda`
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
277 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278 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
279 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
280 output = p2.communicate()[0]
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
283 Replacing os.system()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
284 ---------------------
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
285 sts = os.system("mycmd" + " myarg")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
286 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
287 p = Popen("mycmd" + " myarg", shell=True)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
288 pid, sts = os.waitpid(p.pid, 0)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290 Note:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
291
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
292 * 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
293
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
294 * 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
295 exitstatus.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
296
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
297 A more real-world example would look like this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
298
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
299 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
300 retcode = call("mycmd" + " myarg", shell=True)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
301 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
302 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
303 else:
41843
1f7891d84d93 Remove native popen() and fdopen(), replacing them with subprocess calls.
Guido van Rossum <guido@python.org>
parents: 41732
diff changeset
304 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
305 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
306 print("Execution failed:", e, file=sys.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
307
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
308
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
309 Replacing os.spawn*
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
310 -------------------
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
311 P_NOWAIT example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
312
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
313 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
314 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
315 pid = Popen(["/bin/mycmd", "myarg"]).pid
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
316
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
317
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
318 P_WAIT example:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
319
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
320 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
321 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
322 retcode = call(["/bin/mycmd", "myarg"])
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
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
325 Vector example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
326
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
327 os.spawnvp(os.P_NOWAIT, path, args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
328 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
329 Popen([path] + args[1:])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
330
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
331
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
332 Environment example:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
333
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
334 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
335 ==>
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
336 Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
337 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
338
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
339 import sys
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
340 mswindows = (sys.platform == "win32")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
341
41845
9ce8fa0a0899 Make test_subprocess work. Fix universal newlines in io.py.
Guido van Rossum <guido@python.org>
parents: 41843
diff changeset
342 import io
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
343 import os
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
344 import time
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
345 import traceback
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
346 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
347 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
348 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
349 import warnings
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
350 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
351 try:
1345cf58738d Close #14690: Use monotonic clock instead of system clock in the sched,
Victor Stinner <victor.stinner@gmail.com>
parents: 77154
diff changeset
352 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
353 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
354 from time import time as _time
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
355
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
356 # 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
357 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
358
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
359
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
360 class CalledProcessError(SubprocessError):
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
361 """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
362 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
363 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
364 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
365 """
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
366 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
367 self.returncode = returncode
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
368 self.cmd = cmd
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
369 self.output = output
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
370 def __str__(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
371 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
372
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
373
68463
d674b557600c Add a SubprocessError base class for exceptions in the subprocess module.
Gregory P. Smith <greg@krypto.org>
parents: 68454
diff changeset
374 class TimeoutExpired(SubprocessError):
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
375 """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
376 child process.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
377 """
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
378 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
379 self.cmd = cmd
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
380 self.timeout = timeout
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
381 self.output = output
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
382
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
383 def __str__(self):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
384 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
385 (self.cmd, self.timeout))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
386
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
387
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 import threading
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
390 import msvcrt
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
391 import _winapi
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
392 class STARTUPINFO:
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
393 dwFlags = 0
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
394 hStdInput = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
395 hStdOutput = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
396 hStdError = None
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
397 wShowWindow = 0
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
398 class pywintypes:
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
399 error = IOError
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
401 import select
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
402 _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
403 import _posixsubprocess
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
404 _create_pipe = _posixsubprocess.cloexec_pipe
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
405
55626
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
406 # 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
407 # 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
408 # POSIX defines PIPE_BUF as >= 512.
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
409 _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
410
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
411
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
412 __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
413 "getoutput", "check_output", "CalledProcessError", "DEVNULL"]
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
414
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
415 if mswindows:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
416 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
417 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
418 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
419 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
70050
654d473f2951 normalize whitespace.
Gregory P. Smith <greg@krypto.org>
parents: 70049
diff changeset
420
69690
Brian Curtin <brian@python.org>
parents: 69155 69689
diff changeset
421 __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
422 "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
423 "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
424 "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
425
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
426 class Handle(int):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
427 closed = False
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 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
430 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
431 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
432 CloseHandle(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
433
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
434 def Detach(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
435 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
436 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
437 return int(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
438 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
439
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
440 def __repr__(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
441 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
442
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
443 __del__ = Close
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
444 __str__ = __repr__
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
445
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
447 MAXFD = os.sysconf("SC_OPEN_MAX")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
448 except:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
449 MAXFD = 256
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
450
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
451 # 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
452 # 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
453 # 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
454 # zombie processes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
455 _active = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
456
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
457 def _cleanup():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
458 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
459 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
460 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
461 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
462 _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
463 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
464 # 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
465 # 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
466 pass
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
467
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
468 PIPE = -1
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469 STDOUT = -2
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
470 DEVNULL = -3
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
471
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
473 def _eintr_retry_call(func, *args):
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
474 while True:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
475 try:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
476 return func(*args)
73085
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
477 except InterruptedError:
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
478 continue
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
479
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
480
77036
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
481 # 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
482 # 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
483 # threads.
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
484
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
485 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
486 """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
487 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
488 flag_opt_map = {
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
489 'debug': 'd',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
490 # 'inspect': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
491 # 'interactive': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
492 'optimize': 'O',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
493 '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
494 '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
495 'no_site': 'S',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
496 'ignore_environment': 'E',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
497 'verbose': 'v',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
498 'bytes_warning': 'b',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
499 'quiet': 'q',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
500 'hash_randomization': 'R',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
501 }
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
502 args = []
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
503 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
504 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
505 if v > 0:
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
506 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
507 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
508 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
509 return args
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
510
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
511
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
512 def call(*popenargs, timeout=None, **kwargs):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
513 """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
514 timeout, then return the returncode attribute.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
515
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
516 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
517
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 retcode = call(["ls", "-l"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
520 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
521 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
522 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
523 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
524 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
525 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
526 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
527
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
528
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
529 def check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
530 """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
531 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
532 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
533 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
534
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
535 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
536
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
537 check_call(["ls", "-l"])
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
538 """
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
539 retcode = call(*popenargs, **kwargs)
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
540 if retcode:
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
541 cmd = kwargs.get("args")
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
542 if cmd is None:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
543 cmd = popenargs[0]
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
544 raise CalledProcessError(retcode, cmd)
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
545 return 0
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
546
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
547
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
548 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
549 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
550
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
551 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
552 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
553 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
554
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
555 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
556
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
557 >>> 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
558 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
559
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
560 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
561 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
562
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
563 >>> 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
564 ... "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
565 ... 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
566 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
567
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
568 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
569 string rather than bytes.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
570 """
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
571 if 'stdout' in kwargs:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
572 raise ValueError('stdout argument not allowed, it will be overridden.')
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
573 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
574 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
575 output, unused_err = process.communicate(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
576 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
577 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
578 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
579 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
580 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
581 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
582 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
583 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
584 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
585 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
586 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
587 return output
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
588
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
589
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
590 def list2cmdline(seq):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
591 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592 Translate a sequence of arguments into a command line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593 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
594
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
595 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
596 space or a tab.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
597
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
598 2) A string surrounded by double quotation marks is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
599 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
600 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
601 argument.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
602
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
603 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
604 interpreted as a literal double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
605
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606 4) Backslashes are interpreted literally, unless they
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
607 immediately precede a double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
608
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
609 5) If backslashes immediately precede a double quotation mark,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
610 every pair of backslashes is interpreted as a literal
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
611 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
612 backslash escapes the next double quotation mark as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
613 described in rule 3.
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
616 # See
57156
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
617 # 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
618 # or search http://msdn.microsoft.com for
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
619 # "Parsing C++ Command-Line Arguments"
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
620 result = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
621 needquote = False
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
622 for arg in seq:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
623 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
624
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
625 # 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
626 if result:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
627 result.append(' ')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
628
62404
5de52eb252da Merged revisions 82076 via svnmerge from
Jean-Paul Calderone <exarkun@divmod.com>
parents: 61585
diff changeset
629 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
630 if needquote:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
631 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
632
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
633 for c in arg:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
634 if c == '\\':
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
635 # 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
636 bs_buf.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
637 elif c == '"':
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
638 # Double backslashes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639 result.append('\\' * len(bs_buf)*2)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 result.append('\\"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
642 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
643 # Normal char
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
644 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
645 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
646 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
647 result.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
648
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
649 # Add remaining backslashes, if any.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 result.extend(bs_buf)
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 if needquote:
34675
8f0456425715 Corrected bug in list2cmdline wrt backslashes. Fixes #1083306.
Peter Astrand <astrand@lysator.liu.se>
parents: 34672
diff changeset
654 result.extend(bs_buf)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
655 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
656
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
657 return ''.join(result)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
658
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
659
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
660 # 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
661 #
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
662 # 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
663
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
664 def getstatusoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
665 """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
666
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
667 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
668 (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
669 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
670 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
671 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
672
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
673 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
674 >>> 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
675 (0, '/bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
676 >>> 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
677 (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
678 >>> subprocess.getstatusoutput('/bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
679 (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
680 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
681 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
682 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
683 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
684 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
685 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
686 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
687 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
688 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
689 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
690 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
691 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
692 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
693 text = text[:-1]
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
694 return sts, text
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
695
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
696
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
697 def getoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
698 """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
699
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
700 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
701 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
702
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
703 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
704 >>> 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
705 '/bin/ls'
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
706 """
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
707 return getstatusoutput(cmd)[1]
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
708
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
709
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
710 _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
711
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
712
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
713 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
714 def __init__(self, args, bufsize=-1, executable=None,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
715 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
716 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
717 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
718 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
719 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
720 pass_fds=()):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721 """Create new Popen instance."""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
722 _cleanup()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
723
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
724 self._child_created = False
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
725 self._input = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
726 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
727 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
728 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
729 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
730 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
731
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 if mswindows:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
733 if preexec_fn is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
734 raise ValueError("preexec_fn is not supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
735 "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
736 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
737 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
738 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
739 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
740 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
741 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
742 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
743 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
744 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
745 "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
746 " if you redirect stdin/stdout/stderr")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
747 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
748 # 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
749 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
750 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
751 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
752 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
753 close_fds = True
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
754 if startupinfo is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
755 raise ValueError("startupinfo is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
756 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
757 if creationflags != 0:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
758 raise ValueError("creationflags is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
759 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
760
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
761 self.args = args
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
762 self.stdin = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 self.stdout = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 self.stderr = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
765 self.pid = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
766 self.returncode = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767 self.universal_newlines = universal_newlines
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769 # Input and output objects. The general principle is like
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
770 # this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
771 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 # Parent Child
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
773 # ------ -----
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
774 # p2cwrite ---stdin---> p2cread
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 # c2pread <--stdout--- c2pwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 # errread <--stderr--- errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 # On POSIX, the child objects are file descriptors. On
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
779 # Windows, these are Windows file handles. The parent objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
780 # 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
781 # 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
782 # when not redirecting.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
783
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
784 (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
786 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
787
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
788 # 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
789 # 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
790 # (see #8458).
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40775
diff changeset
792 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
793 if p2cwrite != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
794 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
795 if c2pread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
796 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
797 if errread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
798 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
799
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
800 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
801 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
802 if universal_newlines:
71485
5cc536fbd7c1 Issue #12591: Improve support of "universal newlines" in the subprocess
Antoine Pitrou <solipsis@pitrou.net>
parents: 71228
diff changeset
803 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
804 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
805 self.stdout = io.open(c2pread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
806 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
807 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
808 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
809 self.stderr = io.open(errread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
810 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
811 self.stderr = io.TextIOWrapper(self.stderr)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
812
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
813 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
814 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
815 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
816 startupinfo, creationflags, shell,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
817 p2cread, p2cwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
818 c2pread, c2pwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
819 errread, errwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
820 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
821 except:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
822 # 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
823 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
824 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
825 f.close()
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
826 except EnvironmentError:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
827 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
828
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
829 # Make sure the child pipes are closed as well.
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
830 to_close = []
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
831 if stdin == PIPE:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
832 to_close.append(p2cread)
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
833 if stdout == PIPE:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
834 to_close.append(c2pwrite)
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
835 if stderr == PIPE:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
836 to_close.append(errwrite)
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
837 for fd in to_close:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
838 try:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
839 os.close(fd)
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
840 except EnvironmentError:
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
841 pass
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
842
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
843 raise
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
844
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
845
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
846 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
847 data = data.decode(encoding)
a0f7c2f79bce Issue #15595: Fix subprocess.Popen(universal_newlines=True)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 75524
diff changeset
848 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
849
66622
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
850 def __enter__(self):
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
851 return self
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
852
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
853 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
854 if self.stdout:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
855 self.stdout.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
856 if self.stderr:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
857 self.stderr.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
858 if self.stdin:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
859 self.stdin.close()
70049
b00a64a5cb93 merge - 7a3f3ad83676 Fixes Issue #12044.
Gregory P. Smith <greg@krypto.org>
parents: 69690
diff changeset
860 # 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
861 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
862
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
863 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
864 # 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
865 # 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
866 # 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
867 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
868 # 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
869 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
870 # 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
871 self._internal_poll(_deadstate=_maxsize)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
872 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
873 # 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
874 _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
875
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
876 def _get_devnull(self):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
877 if not hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
878 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
879 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
880
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
881 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
882 """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
883 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
884 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
885 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
886 should be sent to the child.
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
887
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
888 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
889
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
890 if self._communication_started and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
891 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
892
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
893 # 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
894 # 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
895 # 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
896 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
897 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
898 stdout = None
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
899 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
900 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
901 if input:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
902 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
903 self.stdin.write(input)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
904 except IOError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
905 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
906 raise
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
907 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
908 elif self.stdout:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
909 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
910 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
911 elif self.stderr:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
912 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
913 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
914 self.wait()
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
915 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
916 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
917 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
918 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
919 endtime = None
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
920
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
921 try:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
922 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
923 finally:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
924 self._communication_started = True
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
925
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
926 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
927
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
928 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
929
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
930
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
931 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
932 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
933
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
934
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
935 def _remaining_time(self, endtime):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
936 """Convenience for _communicate when computing timeouts."""
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
937 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
938 return None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
939 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
940 return endtime - _time()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
941
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
942
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
943 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
944 """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
945 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
946 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
947 if _time() > endtime:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
948 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
949
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
950
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
951 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
952 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
953 # Windows methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
954 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
955 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
956 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
957 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
958 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
959 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
960 return (-1, -1, -1, -1, -1, -1)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
961
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
962 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
963 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
964 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
965
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
966 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
967 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
968 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
969 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
970 p2cread = Handle(p2cread)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
971 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
972 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
973 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
974 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
975 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
976 p2cread = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
977 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 p2cread = msvcrt.get_osfhandle(stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
979 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
981 p2cread = msvcrt.get_osfhandle(stdin.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
982 p2cread = self._make_inheritable(p2cread)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
983
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
984 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
985 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
986 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
987 _, 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
988 c2pwrite = Handle(c2pwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
989 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
990 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
991 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
992 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
993 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
994 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
995 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
996 c2pwrite = msvcrt.get_osfhandle(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
997 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1000 c2pwrite = self._make_inheritable(c2pwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1001
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1002 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
1003 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
1004 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
1005 _, 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
1006 errwrite = Handle(errwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1007 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1008 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
1009 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
1010 errread, errwrite = Handle(errread), Handle(errwrite)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1011 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1012 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1013 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1014 errwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1015 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 errwrite = msvcrt.get_osfhandle(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1017 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1019 errwrite = msvcrt.get_osfhandle(stderr.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1020 errwrite = self._make_inheritable(errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1021
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1022 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1024 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1025
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1026
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1027 def _make_inheritable(self, handle):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1028 """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
1029 h = _winapi.DuplicateHandle(
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1030 _winapi.GetCurrentProcess(), handle,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1031 _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
1032 _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
1033 return Handle(h)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1035
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1036 def _find_w9xpopen(self):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1037 """Find and return absolut path to w9xpopen.exe"""
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
1038 w9xpopen = os.path.join(
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1039 os.path.dirname(_winapi.GetModuleFileName(0)),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1040 "w9xpopen.exe")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1041 if not os.path.exists(w9xpopen):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1042 # Eeek - file-not-found - possibly an embedding
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1043 # situation - see if we can locate it in sys.exec_prefix
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77036
diff changeset
1044 w9xpopen = os.path.join(os.path.dirname(sys.base_exec_prefix),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1045 "w9xpopen.exe")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1046 if not os.path.exists(w9xpopen):
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1047 raise RuntimeError("Cannot locate w9xpopen.exe, which is "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1048 "needed for Popen to work with your "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1049 "shell or platform.")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1050 return w9xpopen
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1051
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1052
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1053 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
1054 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1055 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1056 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1057 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
1058 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
1059 unused_restore_signals, unused_start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1060 """Execute program (MS Windows version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1061
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
1062 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
1063
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43487
diff changeset
1064 if not isinstance(args, str):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1065 args = list2cmdline(args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1066
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
1067 # Process startup details
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1068 if startupinfo is None:
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1069 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
1070 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
1071 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
1072 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
1073 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
1074 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
1075
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1076 if shell:
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_USESHOWWINDOW
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1078 startupinfo.wShowWindow = _winapi.SW_HIDE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1079 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
1080 args = '{} /c "{}"'.format (comspec, args)
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1081 if (_winapi.GetVersion() >= 0x80000000 or
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1082 os.path.basename(comspec).lower() == "command.com"):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1083 # Win9x, or using command.com on NT. We need to
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1084 # use the w9xpopen intermediate program. For more
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1085 # information, see KB Q150956
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1086 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1087 w9xpopen = self._find_w9xpopen()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088 args = '"%s" %s' % (w9xpopen, args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 # Not passing CREATE_NEW_CONSOLE has been known to
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1090 # cause random failures on win9x. Specifically a
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1091 # dialog: "Your program accessed mem currently in
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1092 # use at xxx" and a hopeful warning about the
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51721
diff changeset
1093 # stability of your system. Cost is Ctrl+C won't
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1094 # kill children.
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1095 creationflags |= _winapi.CREATE_NEW_CONSOLE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1096
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1097 # Start the process
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1098 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1099 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1100 # no special security
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1101 None, None,
41969
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41845
diff changeset
1102 int(not close_fds),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1103 creationflags,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1104 env,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1105 cwd,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1106 startupinfo)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
1107 except pywintypes.error as e:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1108 # Translate pywintypes.error to WindowsError, which is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1109 # a subclass of OSError. FIXME: We should really
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 67311
diff changeset
1110 # translate errno using _sys_errlist (or similar), but
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1111 # how can this be done from Python?
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1112 raise WindowsError(*e.args)
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
1113 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
1114 # 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
1115 # 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
1116 # 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
1117 # 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
1118 # 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
1119 # 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
1120 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
1121 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
1122 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
1123 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
1124 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
1125 errwrite.Close()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1126 if hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1127 os.close(self._devnull)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1128
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1129 # 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
1130 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
1131 self._handle = Handle(hp)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1132 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
1133 _winapi.CloseHandle(ht)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1135 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
1136 _WaitForSingleObject=_winapi.WaitForSingleObject,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1137 _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
1138 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1139 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1140 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1141
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1142 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
1143 in its local scope.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1144
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1145 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1146 if self.returncode is None:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1147 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1148 self.returncode = _GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1149 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1151
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1152 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154 attribute."""
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1155 if endtime is not None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1156 timeout = self._remaining_time(endtime)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1157 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
1158 timeout_millis = _winapi.INFINITE
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1159 else:
68807
ab2363f89058 Fix timeout error message on windows to not be in milliseconds.
Reid Kleckner <reid@kleckner.net>
parents: 68750
diff changeset
1160 timeout_millis = int(timeout * 1000)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1161 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
1162 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
1163 timeout_millis)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1164 if result == _winapi.WAIT_TIMEOUT:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1165 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
1166 self.returncode = _winapi.GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1167 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1168
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1169
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1170 def _readerthread(self, fh, buffer):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1171 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
1172 fh.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1173
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1174
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1175 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
1176 # 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
1177 # object, unless they've already been started.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1178 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
1179 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1180 self.stdout_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1181 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1182 args=(self.stdout, self._stdout_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1183 self.stdout_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1184 self.stdout_thread.start()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1185 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
1186 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1187 self.stderr_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1188 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1189 args=(self.stderr, self._stderr_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1190 self.stderr_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1191 self.stderr_thread.start()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1193 if self.stdin:
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1194 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
1195 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1196 self.stdin.write(input)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1197 except IOError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1198 if e.errno != errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1199 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1200 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1201
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1202 # 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
1203 # 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
1204 # calls communicate again.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1205 if self.stdout is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1206 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
1207 if self.stdout_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1208 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1209 if self.stderr is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1210 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
1211 if self.stderr_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1212 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1213
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1214 # 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
1215 # both have been read successfully.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1216 stdout = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1217 stderr = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1218 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1219 stdout = self._stdout_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1220 self.stdout.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1221 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1222 stderr = self._stderr_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1223 self.stderr.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1224
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1225 # All data exchanged. Translate lists into strings.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1226 if stdout is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1227 stdout = stdout[0]
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1228 if stderr is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1229 stderr = stderr[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1230
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231 return (stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1232
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
1233 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
1234 """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
1235 """
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
1236 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
1237 self.terminate()
60556
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1238 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
1239 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
1240 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
1241 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
1242 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
1243 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
1244
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
1245 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
1246 """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
1247 """
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
1248 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1249 _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
1250 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
1251 # 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
1252 # 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
1253 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
1254 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
1255 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
1256 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
1257
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
1258 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
1259
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1260 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1262 # POSIX methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1263 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264 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
1265 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 """
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
1268 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
1269 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
1270 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1272 if stdin is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1274 elif stdin == PIPE:
66868
de05d846795e issue7213: Open the pipes used by subprocesses with the FD_CLOEXEC flag from
Gregory P. Smith <greg@mad-scientist.com>
parents: 66867
diff changeset
1275 p2cread, p2cwrite = _create_pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1276 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1277 p2cread = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1278 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1279 p2cread = stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1280 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1281 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1282 p2cread = stdin.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1284 if stdout is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1286 elif stdout == PIPE:
66868
de05d846795e issue7213: Open the pipes used by subprocesses with the FD_CLOEXEC flag from
Gregory P. Smith <greg@mad-scientist.com>
parents: 66867
diff changeset
1287 c2pread, c2pwrite = _create_pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1288 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1289 c2pwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1290 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291 c2pwrite = stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1292 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293 # Assuming file-like object
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1294 c2pwrite = stdout.fileno()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1295
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1296 if stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1297 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298 elif stderr == PIPE:
66868
de05d846795e issue7213: Open the pipes used by subprocesses with the FD_CLOEXEC flag from
Gregory P. Smith <greg@mad-scientist.com>
parents: 66867
diff changeset
1299 errread, errwrite = _create_pipe()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1300 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1301 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1302 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1303 errwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1304 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305 errwrite = stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1306 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1307 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1308 errwrite = stderr.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1309
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1310 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1311 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1312 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1314
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1315 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
1316 start_fd = 3
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1317 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
1318 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
1319 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
1320 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
1321 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
1322 os.closerange(start_fd, MAXFD)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1323
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1324
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1325 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
1326 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1327 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1328 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1329 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
1330 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
1331 restore_signals, start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1332 """Execute program (POSIX version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1333
68214
738feec9ced0 Issue #8513: On UNIX, subprocess supports bytes command string.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67358
diff changeset
1334 if isinstance(args, (str, bytes)):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1335 args = [args]
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1336 else:
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1337 args = list(args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1338
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1339 if shell:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1340 args = ["/bin/sh", "-c"] + args
63095
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1341 if executable:
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1342 args[0] = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1343
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1344 if executable is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1345 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
1346 orig_executable = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1347
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
1348 # 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
1349 # 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
1350 # Pickle is not used; it is complex and involves memory allocation.
66868
de05d846795e issue7213: Open the pipes used by subprocesses with the FD_CLOEXEC flag from
Gregory P. Smith <greg@mad-scientist.com>
parents: 66867
diff changeset
1351 errpipe_read, errpipe_write = _create_pipe()
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
1352 try:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1353 try:
70467
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1354 # 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
1355 # 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
1356 # 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
1357 # 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
1358
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
1359 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
1360 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
1361 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
1362 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1363 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
1364 executable = os.fsencode(executable)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1365 if os.path.dirname(executable):
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1366 executable_list = (executable,)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1367 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1368 # 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
1369 executable_list = tuple(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1370 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
1371 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
1372 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
1373 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
1374 self.pid = _posixsubprocess.fork_exec(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1375 args, executable_list,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1376 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
1377 p2cread, p2cwrite, c2pread, c2pwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1378 errread, errwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1379 errpipe_read, errpipe_write,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1380 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
1381 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
1382 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1383 # 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
1384 os.close(errpipe_write)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1385
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
1386 if p2cread != -1 and p2cwrite != -1:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1387 os.close(p2cread)
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
1388 if c2pwrite != -1 and c2pread != -1:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1389 os.close(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
1390 if errwrite != -1 and errread != -1:
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1391 os.close(errwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1392 if hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1393 os.close(self._devnull)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1394
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1395 # 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
1396 # 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
1397 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
1398 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
1399 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
1400 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
1401 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
1402 break
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1403 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1404 # 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
1405 os.close(errpipe_read)
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1406
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1407 if errpipe_data:
66895
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1408 try:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1409 _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
1410 except OSError as e:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1411 if e.errno != errno.ECHILD:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1412 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
1413 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
1414 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
1415 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
1416 except ValueError:
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1417 exception_name = b'RuntimeError'
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1418 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
1419 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
1420 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
1421 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
1422 builtins, exception_name.decode('ascii'),
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1423 RuntimeError)
60896
8428eaa2d3ad Issue #8467: Pure Python implementation of subprocess encodes the error message
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60556
diff changeset
1424 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
1425 if issubclass(child_exception_type, OSError) and hex_errno:
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1426 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
1427 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
1428 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
1429 err_msg = ""
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1430 if errno_num != 0:
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1431 err_msg = os.strerror(errno_num)
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1432 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
1433 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
1434 # 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
1435 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
1436 else:
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1437 err_msg += ': ' + repr(orig_executable)
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1438 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
1439 raise child_exception_type(err_msg)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1440
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1441
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1442 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1443 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1444 _WEXITSTATUS=os.WEXITSTATUS):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1445 # This method is called (indirectly) by __del__, so it cannot
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1446 # refer to anything outside of its local scope."""
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1447 if _WIFSIGNALED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1448 self.returncode = -_WTERMSIG(sts)
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1449 elif _WIFEXITED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1450 self.returncode = _WEXITSTATUS(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1451 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1452 # Should never happen
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1453 raise RuntimeError("Unknown child exit status!")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1454
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1455
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1456 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
81019
0cc4fe5634cf Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80379
diff changeset
1457 _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1458 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1459 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1460
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1461 This method is called by __del__, so it cannot reference anything
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1462 outside of the local scope (nor can any methods it calls).
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1463
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1464 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1465 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1466 try:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1467 pid, sts = _waitpid(self.pid, _WNOHANG)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1468 if pid == self.pid:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1469 self._handle_exitstatus(sts)
79266
484c50bf445c Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD
Gregory P. Smith <greg@krypto.org>
parents: 78655
diff changeset
1470 except _os_error 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
1471 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
1472 self.returncode = _deadstate
81019
0cc4fe5634cf Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80379
diff changeset
1473 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
1474 # 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
1475 # 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
1476 # 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
1477 # 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
1478 # 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
1479 self.returncode = 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1480 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1481
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1482
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1483 def _try_wait(self, wait_flags):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1484 try:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1485 (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
1486 except OSError as e:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1487 if e.errno != errno.ECHILD:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1488 raise
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1489 # 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
1490 # 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
1491 # 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
1492 pid = self.pid
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1493 sts = 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1494 return (pid, sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1495
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1496
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1497 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1498 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1499 attribute."""
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1500 if self.returncode is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1501 return self.returncode
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1502
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1503 # 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
1504 # printing.
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1505 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
1506 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
1507 endtime = _time() + timeout
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1508 elif timeout is None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1509 timeout = self._remaining_time(endtime)
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1510
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1511 if endtime is not None:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1512 # 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
1513 # 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
1514 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
1515 while True:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1516 (pid, sts) = self._try_wait(os.WNOHANG)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1517 assert pid == self.pid or pid == 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1518 if pid == self.pid:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1519 self._handle_exitstatus(sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1520 break
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1521 remaining = self._remaining_time(endtime)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1522 if remaining <= 0:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1523 raise TimeoutExpired(self.args, timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1524 delay = min(delay * 2, remaining, .05)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1525 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
1526 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
1527 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
1528 (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
1529 # 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
1530 # 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
1531 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
1532 self._handle_exitstatus(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1533 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1534
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1535
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1536 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
1537 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
1538 # 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
1539 # 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
1540 self.stdin.flush()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1541 if not input:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1542 self.stdin.close()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1543
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1544 if _has_poll:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1545 stdout, stderr = self._communicate_with_poll(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1546 orig_timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1547 else:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1548 stdout, stderr = self._communicate_with_select(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1549 orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1550
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1551 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
1552
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1553 # 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
1554 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
1555 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
1556 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
1557 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
1558
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1559 # 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
1560 # 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
1561 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
1562 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
1563 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
1564 self.stdout.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1565 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
1566 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
1567 self.stderr.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1568
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1569 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1570
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1571
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
1572 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
1573 # 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
1574 # 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
1575 # 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
1576 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
1577 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
1578 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
1579 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
1580 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
1581
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
1582
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1583 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
1584 stdout = None # Return
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1585 stderr = None # Return
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1586
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1587 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1588 self._fd2file = {}
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1589
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1590 poller = select.poll()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1591 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
1592 poller.register(file_obj.fileno(), eventmask)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1593 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
1594
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1595 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
1596 poller.unregister(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1597 self._fd2file[fd].close()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1598 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
1599
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1600 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
1601 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
1602
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1603 # 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
1604 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1605 self._fd2output = {}
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1606 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1607 self._fd2output[self.stdout.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1608 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1609 self._fd2output[self.stderr.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1610
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1611 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
1612 if self.stdout:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1613 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
1614 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
1615 if self.stderr:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1616 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
1617 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
1618
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
1619 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
1620
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1621 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
1622 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
1623 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
1624 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
1625 try:
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1626 ready = poller.poll(timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1627 except select.error as e:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1628 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
1629 continue
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1630 raise
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1631 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
1632
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1633 # 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
1634 # 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
1635
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1636 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
1637 if mode & select.POLLOUT:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1638 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1639 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
1640 try:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1641 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
1642 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1643 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1644 close_unregister_and_remove(fd)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1645 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1646 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1647 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1648 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
1649 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
1650 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
1651 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
1652 if not data:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1653 close_unregister_and_remove(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1654 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
1655 else:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1656 # 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
1657 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
1658
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1659 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1660
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1661
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1662 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
1663 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1664 self._read_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1665 self._write_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1666 if self.stdin and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1667 self._write_set.append(self.stdin)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1668 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1669 self._read_set.append(self.stdout)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1670 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1671 self._read_set.append(self.stderr)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1672
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
1673 self._save_input(input)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1674
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1675 stdout = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1676 stderr = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1677
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1678 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1679 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1680 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1681 stdout = self._stdout_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1682 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1683 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1684 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1685 stderr = self._stderr_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1686
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1687 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
1688 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
1689 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
1690 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
1691 try:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1692 (rlist, wlist, xlist) = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1693 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
1694 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
1695 except select.error as e:
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
1696 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
1697 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
1698 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1699
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1700 # 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
1701 # that the timeout expired.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1702 if not (rlist or wlist or xlist):
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1703 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1704 # 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
1705 self._check_timeout(endtime, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1706
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
1707 # 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
1708 # 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
1709
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1710 if self.stdin in wlist:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1711 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1712 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
1713 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1714 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
1715 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1716 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1717 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1718 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
1719 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1720 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1721 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1722 self._input_offset += bytes_written
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1723 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
1724 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1725 self._write_set.remove(self.stdin)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1726
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1727 if self.stdout in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1728 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
1729 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1730 self.stdout.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1731 self._read_set.remove(self.stdout)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1732 stdout.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1733
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1734 if self.stderr in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1735 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
1736 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1737 self.stderr.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1738 self._read_set.remove(self.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1739 stderr.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1740
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1741 return (stdout, stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1742
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1743
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
1744 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
1745 """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
1746 """
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
1747 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
1748
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
1749 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
1750 """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
1751 """
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
1752 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
1753
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
1754 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
1755 """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
1756 """
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
1757 self.send_signal(signal.SIGKILL)