annotate Lib/subprocess.py @ 83191:0437c19cdad0

gibibytes (Arfrever)
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 07 Apr 2013 23:46:52 +0200
parents 3031d69f94ef
children 5c45d0ca984f
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
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
399 import select
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
400 _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
401 import _posixsubprocess
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
402 _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
403
55626
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
404 # 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
405 # 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
406 # POSIX defines PIPE_BUF as >= 512.
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
407 _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
408
fb5857f903fe Merged revisions 73917 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 55617
diff changeset
409
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
410 __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
411 "getoutput", "check_output", "CalledProcessError", "DEVNULL"]
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412
60923
91f9168aadd0 Merged revisions 80441 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 59209
diff changeset
413 if mswindows:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
414 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
415 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
416 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
417 STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
70050
654d473f2951 normalize whitespace.
Gregory P. Smith <greg@krypto.org>
parents: 70049
diff changeset
418
69690
Brian Curtin <brian@python.org>
parents: 69155 69689
diff changeset
419 __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
420 "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
421 "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
422 "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
423
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
424 class Handle(int):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
425 closed = False
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
426
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
427 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
428 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
429 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
430 CloseHandle(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
431
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
432 def Detach(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
433 if not self.closed:
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
434 self.closed = True
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
435 return int(self)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
436 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
437
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
438 def __repr__(self):
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
439 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
440
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
441 __del__ = Close
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
442 __str__ = __repr__
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
443
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
444 try:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
445 MAXFD = os.sysconf("SC_OPEN_MAX")
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446 except:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
447 MAXFD = 256
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
448
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
449 # 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
450 # 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
451 # 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
452 # zombie processes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
453 _active = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
454
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
455 def _cleanup():
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
456 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
457 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
458 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
459 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
460 _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
461 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
462 # 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
463 # 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
464 pass
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
465
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
466 PIPE = -1
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
467 STDOUT = -2
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
468 DEVNULL = -3
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
470
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
471 def _eintr_retry_call(func, *args):
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
472 while True:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
473 try:
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
474 return func(*args)
73085
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
475 except InterruptedError:
90f81045613a Use InterruptedError instead of checking for EINTR
Antoine Pitrou <solipsis@pitrou.net>
parents: 72168
diff changeset
476 continue
59209
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
477
1f158238fa76 Merged revisions 78524 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57156
diff changeset
478
77036
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
479 # 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
480 # 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
481 # threads.
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
482
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
483 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
484 """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
485 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
486 flag_opt_map = {
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
487 'debug': 'd',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
488 # 'inspect': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
489 # 'interactive': 'i',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
490 'optimize': 'O',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
491 '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
492 '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
493 'no_site': 'S',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
494 'ignore_environment': 'E',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
495 'verbose': 'v',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
496 'bytes_warning': 'b',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
497 'quiet': 'q',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
498 'hash_randomization': 'R',
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
499 }
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
500 args = []
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
501 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
502 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
503 if v > 0:
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
504 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
505 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
506 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
507 return args
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
508
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 76405
diff changeset
509
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
510 def call(*popenargs, timeout=None, **kwargs):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
511 """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
512 timeout, then return the returncode attribute.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
513
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 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
515
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
516 retcode = call(["ls", "-l"])
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
517 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
518 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
519 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
520 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
521 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
522 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
523 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
524 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
526
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
527 def check_call(*popenargs, **kwargs):
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
528 """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
529 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
530 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
531 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
532
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
533 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
534
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
535 check_call(["ls", "-l"])
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 retcode = call(*popenargs, **kwargs)
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
538 if retcode:
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
539 cmd = kwargs.get("args")
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
540 if cmd is None:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
541 cmd = popenargs[0]
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
542 raise CalledProcessError(retcode, cmd)
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
543 return 0
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
544
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
545
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
546 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
547 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
548
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
549 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
550 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
551 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
552
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
553 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
554
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
555 >>> 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
556 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
557
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
558 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
559 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
560
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
561 >>> 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
562 ... "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
563 ... 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
564 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
565
993b7e0eb8be Use a larger amount of data for tests such as the interrupted_write
Gregory P. Smith <greg@krypto.org>
parents: 81998
diff changeset
566 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
567 string rather than bytes.
50074
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
568 """
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
569 if 'stdout' in kwargs:
024a9897c651 Merged revisions 67511,67536-67537,67543 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48752
diff changeset
570 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
571 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
572 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
573 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
574 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
575 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
576 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
577 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
578 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
579 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
580 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
581 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
582 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
583 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
584 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
585 return output
34302
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
586
998fb1e1c8e9 New subprocess utility function: check_call. Closes #1071764.
Peter Astrand <astrand@lysator.liu.se>
parents: 34111
diff changeset
587
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
588 def list2cmdline(seq):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
589 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
590 Translate a sequence of arguments into a command line
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
591 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
592
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593 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
594 space or a tab.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
595
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
596 2) A string surrounded by double quotation marks is
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
597 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
598 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
599 argument.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
600
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
601 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
602 interpreted as a literal double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
603
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
604 4) Backslashes are interpreted literally, unless they
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
605 immediately precede a double quotation mark.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
607 5) If backslashes immediately precede a double quotation mark,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
608 every pair of backslashes is interpreted as a literal
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
609 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
610 backslash escapes the next double quotation mark as
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
611 described in rule 3.
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
612 """
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
613
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
614 # See
57156
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
615 # 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
616 # or search http://msdn.microsoft.com for
667d9779cad6 Merged revisions 76170 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 55626
diff changeset
617 # "Parsing C++ Command-Line Arguments"
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
618 result = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
619 needquote = False
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
620 for arg in seq:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
621 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
622
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
623 # 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
624 if result:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
625 result.append(' ')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
626
62404
5de52eb252da Merged revisions 82076 via svnmerge from
Jean-Paul Calderone <exarkun@divmod.com>
parents: 61585
diff changeset
627 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
628 if needquote:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
629 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
630
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
631 for c in arg:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
632 if c == '\\':
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
633 # 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
634 bs_buf.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
635 elif c == '"':
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
636 # Double backslashes.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
637 result.append('\\' * len(bs_buf)*2)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
638 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639 result.append('\\"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 # Normal char
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
642 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
643 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
644 bs_buf = []
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
645 result.append(c)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
646
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
647 # Add remaining backslashes, if any.
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
648 if bs_buf:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
649 result.extend(bs_buf)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 if needquote:
34675
8f0456425715 Corrected bug in list2cmdline wrt backslashes. Fixes #1083306.
Peter Astrand <astrand@lysator.liu.se>
parents: 34672
diff changeset
652 result.extend(bs_buf)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
653 result.append('"')
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
654
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
655 return ''.join(result)
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
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
658 # 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
659 #
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
660 # 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
661
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
662 def getstatusoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
663 """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
664
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
665 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
666 (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
667 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
668 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
669 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
670
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
671 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
672 >>> 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
673 (0, '/bin/ls')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
674 >>> 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
675 (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
676 >>> subprocess.getstatusoutput('/bin/junk')
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
677 (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
678 """
72168
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
679 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
680 try:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
681 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
682 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
683 except:
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
684 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
685 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
686 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
687 raise
86b7f14485c9 Issue #12494: Close pipes and kill process on error in subprocess functions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71909
diff changeset
688 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
689 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
690 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
691 text = text[:-1]
47331
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
692 return sts, text
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
693
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
694
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
695 def getoutput(cmd):
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
696 """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
697
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
698 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
699 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
700
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
701 >>> import subprocess
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
702 >>> 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
703 '/bin/ls'
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
704 """
0525cd5b2582 The commands module has been removed. The getoutput() and getstatusoutput()
Brett Cannon <bcannon@gmail.com>
parents: 46505
diff changeset
705 return getstatusoutput(cmd)[1]
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
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
708 _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
709
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
710
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
711 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
712 def __init__(self, args, bufsize=-1, executable=None,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
713 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
714 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
715 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
716 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
717 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
718 pass_fds=()):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
719 """Create new Popen instance."""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
720 _cleanup()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721
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
722 self._child_created = False
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
723 self._input = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
724 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
725 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
726 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
727 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
728 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
729
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
730 if mswindows:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
731 if preexec_fn is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
732 raise ValueError("preexec_fn is not supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
733 "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
734 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
735 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
736 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
737 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
738 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
739 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
740 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
741 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
742 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
743 "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
744 " if you redirect stdin/stdout/stderr")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
745 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
746 # 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
747 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
748 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
749 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
750 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
751 close_fds = True
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
752 if startupinfo is not None:
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
753 raise ValueError("startupinfo is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
754 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755 if creationflags != 0:
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
756 raise ValueError("creationflags is only supported on Windows "
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
757 "platforms")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
758
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
759 self.args = args
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
760 self.stdin = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
761 self.stdout = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
762 self.stderr = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 self.pid = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 self.returncode = None
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
765 self.universal_newlines = universal_newlines
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
766
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767 # Input and output objects. The general principle is like
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768 # this:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
770 # Parent Child
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 # p2cwrite ---stdin---> p2cread
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
773 # c2pread <--stdout--- c2pwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
774 # errread <--stderr--- errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 # On POSIX, the child objects are file descriptors. On
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 # Windows, these are Windows file handles. The parent objects
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 # 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
779 # 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
780 # when not redirecting.
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
781
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
782 (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
783 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
784 errread, errwrite) = self._get_handles(stdin, stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
786 # 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
787 # 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
788 # (see #8458).
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40775
diff changeset
790 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
791 if p2cwrite != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
792 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
793 if c2pread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
794 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
795 if errread != -1:
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
796 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
797
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
798 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
799 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
800 if universal_newlines:
71485
5cc536fbd7c1 Issue #12591: Improve support of "universal newlines" in the subprocess
Antoine Pitrou <solipsis@pitrou.net>
parents: 71228
diff changeset
801 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
802 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
803 self.stdout = io.open(c2pread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 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
805 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
806 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
807 self.stderr = io.open(errread, 'rb', bufsize)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
808 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
809 self.stderr = io.TextIOWrapper(self.stderr)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
810
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
811 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
812 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
813 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
814 startupinfo, creationflags, shell,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
815 p2cread, p2cwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
816 c2pread, c2pwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
817 errread, errwrite,
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
818 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
819 except:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
820 # 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
821 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
822 try:
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
823 f.close()
80922
061e9a439f54 Get rig of EnvironmentError (#16705)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80920
diff changeset
824 except OSError:
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
825 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
826
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
827 # 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
828 to_close = []
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
829 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
830 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
831 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
832 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
833 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
834 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
835 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
836 try:
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
837 os.close(fd)
80922
061e9a439f54 Get rig of EnvironmentError (#16705)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80920
diff changeset
838 except OSError:
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
839 pass
80368
63ff4c9a2ed2 Fixes issue #16327: The subprocess module no longer leaks file descriptors
Gregory P. Smith <greg@krypto.org>
parents: 80362
diff changeset
840
67358
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
841 raise
8af6e8fc0205 In subprocess, wrap pipe fds before launching the child. Hopefully this
Antoine Pitrou <solipsis@pitrou.net>
parents: 67331
diff changeset
842
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
843
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
844 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
845 data = data.decode(encoding)
a0f7c2f79bce Issue #15595: Fix subprocess.Popen(universal_newlines=True)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 75524
diff changeset
846 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
847
66622
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
848 def __enter__(self):
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
849 return self
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
850
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
851 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
852 if self.stdout:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
853 self.stdout.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
854 if self.stderr:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
855 self.stderr.close()
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
856 if self.stdin:
e02021fbfe22 Fix #10554. Added context manager support to Popen objects.
Brian Curtin <brian.curtin@gmail.com>
parents: 66309
diff changeset
857 self.stdin.close()
70049
b00a64a5cb93 merge - 7a3f3ad83676 Fixes Issue #12044.
Gregory P. Smith <greg@krypto.org>
parents: 69690
diff changeset
858 # 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
859 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
860
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
861 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
862 # 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
863 # 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
864 # 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
865 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
866 # 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
867 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
868 # 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
869 self._internal_poll(_deadstate=_maxsize)
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
870 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
871 # 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
872 _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
873
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
874 def _get_devnull(self):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
875 if not hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
876 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
877 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
878
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
879 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
880 """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
881 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
882 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
883 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
884 should be sent to the child.
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
885
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
886 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
887
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
888 if self._communication_started and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
889 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
890
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
891 # 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
892 # 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
893 # 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
894 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
895 [self.stdin, self.stdout, self.stderr].count(None) >= 2):
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
896 stdout = None
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
897 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
898 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
899 if input:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
900 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
901 self.stdin.write(input)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81021
diff changeset
902 except OSError as e:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
903 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
904 raise
34672
085bc27f92b7 Optimization for communicate(): If only one of stdin/stdout/stderr is
Peter Astrand <astrand@lysator.liu.se>
parents: 34624
diff changeset
905 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
906 elif self.stdout:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
907 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
908 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
909 elif self.stderr:
71228
dcfacc2d93b4 Issue #12493: subprocess: communicate() handles EINTR
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70921
diff changeset
910 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
911 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
912 self.wait()
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
913 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
914 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
915 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
916 else:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
917 endtime = None
34818
4eaab38566c9 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34675
diff changeset
918
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
919 try:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
920 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
921 finally:
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
922 self._communication_started = True
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
923
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
924 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
925
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
926 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
927
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
928
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
929 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
930 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
931
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
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
933 def _remaining_time(self, endtime):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
934 """Convenience for _communicate when computing timeouts."""
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
935 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
936 return None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
937 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
938 return endtime - _time()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
939
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
940
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
941 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
942 """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
943 if endtime is None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
944 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
945 if _time() > endtime:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
946 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
947
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
948
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
949 if mswindows:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
950 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
951 # Windows methods
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 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
954 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
955 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
956 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
957 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
958 return (-1, -1, -1, -1, -1, -1)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
959
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 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
961 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
962 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
963
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
964 if 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
965 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
966 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
967 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
968 p2cread = Handle(p2cread)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
969 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
970 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
971 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
972 p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
973 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
974 p2cread = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
975 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
976 p2cread = msvcrt.get_osfhandle(stdin)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
977 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
979 p2cread = msvcrt.get_osfhandle(stdin.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980 p2cread = self._make_inheritable(p2cread)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
981
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
982 if 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
983 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
984 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
985 _, 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
986 c2pwrite = Handle(c2pwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
987 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
988 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
989 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
990 c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
991 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
992 c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
993 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
994 c2pwrite = msvcrt.get_osfhandle(stdout)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
995 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
996 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
997 c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998 c2pwrite = self._make_inheritable(c2pwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1000 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
1001 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
1002 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
1003 _, 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
1004 errwrite = Handle(errwrite)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1005 _winapi.CloseHandle(_)
51981
d77172eb6fe7 Merged revisions 70137 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51776
diff changeset
1006 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
1007 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
1008 errread, errwrite = Handle(errread), Handle(errwrite)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1009 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1010 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1011 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1012 errwrite = msvcrt.get_osfhandle(self._get_devnull())
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1013 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1014 errwrite = msvcrt.get_osfhandle(stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1015 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1017 errwrite = msvcrt.get_osfhandle(stderr.fileno())
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 errwrite = self._make_inheritable(errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1019
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1020 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1021 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1022 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1024
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1025 def _make_inheritable(self, handle):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1026 """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
1027 h = _winapi.DuplicateHandle(
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1028 _winapi.GetCurrentProcess(), handle,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1029 _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
1030 _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
1031 return Handle(h)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1032
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1033
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034 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
1035 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1036 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1037 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1038 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
1039 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
1040 unused_restore_signals, unused_start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1041 """Execute program (MS Windows version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1042
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
1043 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
1044
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43487
diff changeset
1045 if not isinstance(args, str):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1046 args = list2cmdline(args)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1047
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
1048 # Process startup details
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1049 if startupinfo is None:
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1050 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
1051 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
1052 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
1053 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
1054 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
1055 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
1056
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1057 if shell:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1058 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
1059 startupinfo.wShowWindow = _winapi.SW_HIDE
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1060 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
1061 args = '{} /c "{}"'.format (comspec, args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1062
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1063 # Start the process
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1064 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1065 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1066 # no special security
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1067 None, None,
41969
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41845
diff changeset
1068 int(not close_fds),
33735
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1069 creationflags,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1070 env,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1071 cwd,
1383c4692af7 Folded long lines.
Tim Peters <tim.peters@gmail.com>
parents: 33731
diff changeset
1072 startupinfo)
63816
f4d92c6d4d42 Issue #3210: Revert C module changes and apply patch from Hirokazu Yamamoto instead
Tim Golden <mail@timgolden.me.uk>
parents: 63095
diff changeset
1073 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
1074 # 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
1075 # 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
1076 # 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
1077 # 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
1078 # 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
1079 # 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
1080 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
1081 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
1082 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
1083 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
1084 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
1085 errwrite.Close()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1086 if hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1087 os.close(self._devnull)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 # 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
1090 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
1091 self._handle = Handle(hp)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1092 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
1093 _winapi.CloseHandle(ht)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1094
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1095 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
1096 _WaitForSingleObject=_winapi.WaitForSingleObject,
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1097 _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
1098 _GetExitCodeProcess=_winapi.GetExitCodeProcess):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1099 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1100 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1101
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1102 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
1103 in its local scope.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1104
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1105 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1106 if self.returncode is None:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1107 if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1108 self.returncode = _GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1109 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1110
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1111
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1112 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1114 attribute."""
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1115 if endtime is not None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1116 timeout = self._remaining_time(endtime)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1117 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
1118 timeout_millis = _winapi.INFINITE
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1119 else:
68807
ab2363f89058 Fix timeout error message on windows to not be in milliseconds.
Reid Kleckner <reid@kleckner.net>
parents: 68750
diff changeset
1120 timeout_millis = int(timeout * 1000)
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1121 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
1122 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
1123 timeout_millis)
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1124 if result == _winapi.WAIT_TIMEOUT:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1125 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
1126 self.returncode = _winapi.GetExitCodeProcess(self._handle)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1127 return self.returncode
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
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1130 def _readerthread(self, fh, buffer):
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131 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
1132 fh.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1133
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1135 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
1136 # 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
1137 # object, unless they've already been started.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1138 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
1139 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1140 self.stdout_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1141 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1142 args=(self.stdout, self._stdout_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1143 self.stdout_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1144 self.stdout_thread.start()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1145 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
1146 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1147 self.stderr_thread = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1148 threading.Thread(target=self._readerthread,
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1149 args=(self.stderr, self._stderr_buff))
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1150 self.stderr_thread.daemon = True
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1151 self.stderr_thread.start()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1152
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 if self.stdin:
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1154 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
1155 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1156 self.stdin.write(input)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81021
diff changeset
1157 except OSError as e:
69154
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1158 if e.errno != errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1159 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1160 self.stdin.close()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1161
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1162 # 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
1163 # 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
1164 # calls communicate again.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1165 if self.stdout is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1166 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
1167 if self.stdout_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1168 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1169 if self.stderr is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1170 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
1171 if self.stderr_thread.is_alive():
68750
6017c431ff0d Fix the Windows timeout code.
Reid Kleckner <reid@kleckner.net>
parents: 68681
diff changeset
1172 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1173
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1174 # 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
1175 # both have been read successfully.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1176 stdout = None
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1177 stderr = None
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1178 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1179 stdout = self._stdout_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1180 self.stdout.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1181 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1182 stderr = self._stderr_buff
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1183 self.stderr.close()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1184
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1185 # All data exchanged. Translate lists into strings.
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1186 if stdout is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1187 stdout = stdout[0]
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1188 if stderr is not None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1189 stderr = stderr[0]
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1190
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1191 return (stdout, stderr)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192
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
1193 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
1194 """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
1195 """
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
1196 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
1197 self.terminate()
60556
a2f5b3b19eb2 Port #1220212 (os.kill for Win32) to py3k.
Brian Curtin <brian.curtin@gmail.com>
parents: 59619
diff changeset
1198 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
1199 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
1200 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
1201 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
1202 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
1203 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
1204
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
1205 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
1206 """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
1207 """
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
1208 try:
76405
f3a27d11101a Issue #11750: The Windows API functions scattered in the _subprocess and
Antoine Pitrou <solipsis@pitrou.net>
parents: 75525
diff changeset
1209 _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
1210 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
1211 # 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
1212 # 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
1213 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
1214 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
1215 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
1216 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
1217
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44810
diff changeset
1218 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
1219
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1220 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1221 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1222 # POSIX methods
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1223 #
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1224 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
1225 """Construct and return tuple with IO objects:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1226 p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1227 """
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
1228 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
1229 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
1230 errread, errwrite = -1, -1
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1232 if stdin is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1233 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1234 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
1235 p2cread, p2cwrite = _create_pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1236 elif stdin == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1237 p2cread = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1238 elif isinstance(stdin, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1239 p2cread = stdin
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1240 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1242 p2cread = stdin.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1244 if stdout is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1245 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246 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
1247 c2pread, c2pwrite = _create_pipe()
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1248 elif stdout == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1249 c2pwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1250 elif isinstance(stdout, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 c2pwrite = stdout
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1253 # Assuming file-like object
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1254 c2pwrite = stdout.fileno()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1255
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1256 if stderr is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1257 pass
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1258 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
1259 errread, errwrite = _create_pipe()
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1260 elif stderr == STDOUT:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261 errwrite = c2pwrite
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1262 elif stderr == DEVNULL:
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1263 errwrite = self._get_devnull()
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1264 elif isinstance(stderr, int):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1265 errwrite = stderr
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 # Assuming file-like object
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268 errwrite = stderr.fileno()
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1269
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1270 return (p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271 c2pread, c2pwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1272 errread, errwrite)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1274
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1275 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
1276 start_fd = 3
67331
9ad896426f79 Un-complicate some code
Antoine Pitrou <solipsis@pitrou.net>
parents: 67310
diff changeset
1277 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
1278 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
1279 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
1280 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
1281 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
1282 os.closerange(start_fd, MAXFD)
33731
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1283
53c468d0955b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 33727
diff changeset
1284
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 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
1286 pass_fds, cwd, env,
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1287 startupinfo, creationflags, shell,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1288 p2cread, p2cwrite,
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1289 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
1290 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
1291 restore_signals, start_new_session):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1292 """Execute program (POSIX version)"""
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293
68214
738feec9ced0 Issue #8513: On UNIX, subprocess supports bytes command string.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67358
diff changeset
1294 if isinstance(args, (str, bytes)):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1295 args = [args]
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1296 else:
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39646
diff changeset
1297 args = list(args)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1299 if shell:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1300 args = ["/bin/sh", "-c"] + args
63095
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1301 if executable:
ad66eff9800b Merged revisions 82971 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 62404
diff changeset
1302 args[0] = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1303
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1304 if executable is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305 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
1306 orig_executable = executable
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1307
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
1308 # 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
1309 # 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
1310 # 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
1311 errpipe_read, errpipe_write = _create_pipe()
44810
fa6cee14dcba Merged revisions 60094-60123 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
1312 try:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313 try:
70467
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1314 # 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
1315 # 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
1316 # 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
1317 # 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
1318
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
1319 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
1320 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
1321 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
1322 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1323 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
1324 executable = os.fsencode(executable)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1325 if os.path.dirname(executable):
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1326 executable_list = (executable,)
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1327 else:
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1328 # 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
1329 executable_list = tuple(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1330 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
1331 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
1332 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
1333 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
1334 self.pid = _posixsubprocess.fork_exec(
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1335 args, executable_list,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1336 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
1337 p2cread, p2cwrite, c2pread, c2pwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1338 errread, errwrite,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1339 errpipe_read, errpipe_write,
75ca834df824 The _posixsubprocess module is now required on POSIX.
Gregory P. Smith <greg@krypto.org>
parents: 70289
diff changeset
1340 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
1341 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
1342 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1343 # 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
1344 os.close(errpipe_write)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1345
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
1346 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
1347 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
1348 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
1349 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
1350 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
1351 os.close(errwrite)
68600
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1352 if hasattr(self, '_devnull'):
eaf93e156dff Issue #5870: Add subprocess.DEVNULL constant.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68587
diff changeset
1353 os.close(self._devnull)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1354
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1355 # 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
1356 # 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
1357 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
1358 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
1359 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
1360 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
1361 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
1362 break
54797
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1363 finally:
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1364 # 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
1365 os.close(errpipe_read)
5fafcb32f062 Issue #6274. Fixed a potential FD leak in subprocess.py.
Facundo Batista <facundobatista@gmail.com>
parents: 51981
diff changeset
1366
80372
99c63578f932 Rename a local variable for readability and change a "this can't
Gregory P. Smith <greg@krypto.org>
parents: 80368
diff changeset
1367 if errpipe_data:
66895
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1368 try:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1369 _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
1370 except OSError as e:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1371 if e.errno != errno.ECHILD:
b066bd0b64e7 Merged revisions 87233 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 65109
diff changeset
1372 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
1373 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
1374 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
1375 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
1376 except ValueError:
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1377 exception_name = b'SubprocessError'
59605
768722b2ae0a * Replaces the internals of the subprocess module from fork through exec on
Gregory P. Smith <greg@mad-scientist.com>
parents: 59471
diff changeset
1378 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
1379 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
1380 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
1381 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
1382 builtins, exception_name.decode('ascii'),
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1383 SubprocessError)
60896
8428eaa2d3ad Issue #8467: Pure Python implementation of subprocess encodes the error message
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60556
diff changeset
1384 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
1385 if issubclass(child_exception_type, OSError) and hex_errno:
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1386 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
1387 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
1388 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
1389 err_msg = ""
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1390 if errno_num != 0:
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1391 err_msg = os.strerror(errno_num)
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1392 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
1393 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
1394 # 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
1395 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
1396 else:
e938fa6be509 Fixes Issue #16114: The subprocess module no longer provides a
Gregory P. Smith <greg@krypto.org>
parents: 79266
diff changeset
1397 err_msg += ': ' + repr(orig_executable)
66309
43e50bb923a9 don't shadow globals
Benjamin Peterson <benjamin@python.org>
parents: 66307
diff changeset
1398 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
1399 raise child_exception_type(err_msg)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1400
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1401
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1402 def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1403 _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED,
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1404 _WEXITSTATUS=os.WEXITSTATUS):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1405 # This method is called (indirectly) by __del__, so it cannot
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1406 # refer to anything outside of its local scope."""
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1407 if _WIFSIGNALED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1408 self.returncode = -_WTERMSIG(sts)
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1409 elif _WIFEXITED(sts):
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1410 self.returncode = _WEXITSTATUS(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1411 else:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1412 # Should never happen
80375
9180fb4eccc7 Raise our own SubprocessError rather than a RuntimeError in when dealing with
Gregory P. Smith <greg@krypto.org>
parents: 80373
diff changeset
1413 raise SubprocessError("Unknown child exit status!")
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1414
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1415
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1416 def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
81021
8f30461395b1 Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 81005 81020
diff changeset
1417 _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1418 """Check if child process has terminated. Returns returncode
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1419 attribute.
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1420
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1421 This method is called by __del__, so it cannot reference anything
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1422 outside of the local scope (nor can any methods it calls).
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1423
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1424 """
34575
4545a154fac1 Patch from Leandro Lucarella: replaced:
Peter Astrand <astrand@lysator.liu.se>
parents: 34551
diff changeset
1425 if self.returncode is None:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1426 try:
61569
58a56aba0eb2 Backport r81155.
Brett Cannon <bcannon@gmail.com>
parents: 60923
diff changeset
1427 pid, sts = _waitpid(self.pid, _WNOHANG)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1428 if pid == self.pid:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1429 self._handle_exitstatus(sts)
80932
47f98a550d42 Issue #16706: get rid of os.error
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80922
diff changeset
1430 except OSError as e:
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37048
diff changeset
1431 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
1432 self.returncode = _deadstate
81019
0cc4fe5634cf Keep ref to ECHILD in local scope (#16650)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80379
diff changeset
1433 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
1434 # 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
1435 # 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
1436 # 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
1437 # 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
1438 # 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
1439 self.returncode = 0
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1440 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1441
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1442
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1443 def _try_wait(self, wait_flags):
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1444 try:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1445 (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
1446 except OSError as e:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1447 if e.errno != errno.ECHILD:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1448 raise
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1449 # 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
1450 # 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
1451 # 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
1452 pid = self.pid
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1453 sts = 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1454 return (pid, sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1455
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1456
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1457 def wait(self, timeout=None, endtime=None):
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1458 """Wait for child process to terminate. Returns returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1459 attribute."""
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1460 if self.returncode is not None:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1461 return self.returncode
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1462
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1463 # 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
1464 # printing.
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1465 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
1466 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
1467 endtime = _time() + timeout
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1468 elif timeout is None:
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1469 timeout = self._remaining_time(endtime)
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1470
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1471 if endtime is not None:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1472 # 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
1473 # 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
1474 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
1475 while True:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1476 (pid, sts) = self._try_wait(os.WNOHANG)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1477 assert pid == self.pid or pid == 0
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1478 if pid == self.pid:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1479 self._handle_exitstatus(sts)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1480 break
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1481 remaining = self._remaining_time(endtime)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1482 if remaining <= 0:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1483 raise TimeoutExpired(self.args, timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1484 delay = min(delay * 2, remaining, .05)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1485 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
1486 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
1487 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
1488 (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
1489 # 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
1490 # 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
1491 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
1492 self._handle_exitstatus(sts)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1493 return self.returncode
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1494
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1495
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1496 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
1497 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
1498 # 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
1499 # 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
1500 self.stdin.flush()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1501 if not input:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1502 self.stdin.close()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1503
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1504 if _has_poll:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1505 stdout, stderr = self._communicate_with_poll(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1506 orig_timeout)
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1507 else:
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1508 stdout, stderr = self._communicate_with_select(input, endtime,
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1509 orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1510
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1511 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
1512
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1513 # 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
1514 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
1515 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
1516 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
1517 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
1518
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1519 # 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
1520 # 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
1521 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
1522 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
1523 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
1524 self.stdout.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1525 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
1526 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
1527 self.stderr.encoding)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1528
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1529 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1530
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1531
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
1532 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
1533 # 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
1534 # 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
1535 # 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
1536 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
1537 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
1538 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
1539 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
1540 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
1541
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
1542
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1543 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
1544 stdout = None # Return
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1545 stderr = None # Return
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1546
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1547 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1548 self._fd2file = {}
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1549
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1550 poller = select.poll()
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1551 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
1552 poller.register(file_obj.fileno(), eventmask)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1553 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
1554
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1555 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
1556 poller.unregister(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1557 self._fd2file[fd].close()
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1558 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
1559
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1560 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
1561 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
1562
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1563 # 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
1564 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1565 self._fd2output = {}
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1566 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1567 self._fd2output[self.stdout.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1568 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1569 self._fd2output[self.stderr.fileno()] = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1570
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1571 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
1572 if self.stdout:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1573 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
1574 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
1575 if self.stderr:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1576 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
1577 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
1578
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
1579 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
1580
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1581 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
1582 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
1583 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
1584 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
1585 try:
69152
3664fc29e867 Issue #11757: subprocess ensures that select() and poll() timeout >= 0
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69011
diff changeset
1586 ready = poller.poll(timeout)
80920
eb8032781eba Issue #16704: Get rid of select.error in stdlib. Use OSError instead.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80909
diff changeset
1587 except OSError as e:
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1588 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
1589 continue
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1590 raise
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1591 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
1592
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1593 # 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
1594 # 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
1595
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1596 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
1597 if mode & select.POLLOUT:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1598 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1599 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
1600 try:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1601 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
1602 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1603 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1604 close_unregister_and_remove(fd)
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1605 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1606 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1607 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1608 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
1609 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
1610 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
1611 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
1612 if not data:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1613 close_unregister_and_remove(fd)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1614 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
1615 else:
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1616 # 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
1617 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
1618
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1619 return (stdout, stderr)
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1620
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1621
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1622 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
1623 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1624 self._read_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1625 self._write_set = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1626 if self.stdin and input:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1627 self._write_set.append(self.stdin)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1628 if self.stdout:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1629 self._read_set.append(self.stdout)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1630 if self.stderr:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1631 self._read_set.append(self.stderr)
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1632
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
1633 self._save_input(input)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1634
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1635 stdout = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1636 stderr = None # Return
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1637
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1638 if self.stdout:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1639 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1640 self._stdout_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1641 stdout = self._stdout_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1642 if self.stderr:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1643 if not self._communication_started:
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1644 self._stderr_buff = []
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1645 stderr = self._stderr_buff
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1646
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1647 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
1648 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
1649 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
1650 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
1651 try:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1652 (rlist, wlist, xlist) = \
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1653 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
1654 timeout)
80920
eb8032781eba Issue #16704: Get rid of select.error in stdlib. Use OSError instead.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80909
diff changeset
1655 except OSError as e:
48494
aca5b2e6a66f Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48395
diff changeset
1656 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
1657 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
1658 raise
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1659
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1660 # 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
1661 # that the timeout expired.
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1662 if not (rlist or wlist or xlist):
68618
a161081e8f7c Include the timeout value in TimeoutExpired.
Reid Kleckner <reid@kleckner.net>
parents: 68600
diff changeset
1663 raise TimeoutExpired(self.args, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1664 # 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
1665 self._check_timeout(endtime, orig_timeout)
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1666
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43684
diff changeset
1667 # 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
1668 # 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
1669
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1670 if self.stdin in wlist:
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1671 chunk = self._input[self._input_offset :
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1672 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
1673 try:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1674 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
1675 except OSError as e:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1676 if e.errno == errno.EPIPE:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1677 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1678 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
1679 else:
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1680 raise
158495d49f58 Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 68679
diff changeset
1681 else:
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1682 self._input_offset += bytes_written
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1683 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
1684 self.stdin.close()
69156
c81ad4361c49 Merge with 3.2
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 69152 69155
diff changeset
1685 self._write_set.remove(self.stdin)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1686
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1687 if self.stdout in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1688 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
1689 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1690 self.stdout.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1691 self._read_set.remove(self.stdout)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1692 stdout.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1693
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1694 if self.stderr in rlist:
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1695 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
1696 if not data:
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1697 self.stderr.close()
68454
c4a0fa6e687c Add a 'timeout' argument to subprocess.Popen.
Reid Kleckner <reid@kleckner.net>
parents: 68258
diff changeset
1698 self._read_set.remove(self.stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1699 stderr.append(data)
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1700
55602
680ad8eed33b Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54797
diff changeset
1701 return (stdout, stderr)
33723
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1702
76641824cf05 Added Peter Astrand's subprocess module.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1703
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
1704 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
1705 """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
1706 """
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
1707 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
1708
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
1709 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
1710 """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
1711 """
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
1712 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
1713
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
1714 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
1715 """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
1716 """
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
1717 self.send_signal(signal.SIGKILL)