mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Optimization for communicate(): If only one of stdin/stdout/stderr is
redirected, using select() or threads is unnecessary.
This commit is contained in:
parent
cbac93c229
commit
23109f0009
1 changed files with 29 additions and 16 deletions
|
@ -619,6 +619,33 @@ class Popen(object):
|
||||||
data = data.replace("\r", "\n")
|
data = data.replace("\r", "\n")
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def communicate(self, input=None):
|
||||||
|
"""Interact with process: Send data to stdin. Read data from
|
||||||
|
stdout and stderr, until end-of-file is reached. Wait for
|
||||||
|
process to terminate. The optional input argument should be a
|
||||||
|
string to be sent to the child process, or None, if no data
|
||||||
|
should be sent to the child.
|
||||||
|
|
||||||
|
communicate() returns a tuple (stdout, stderr)."""
|
||||||
|
|
||||||
|
# Optimization: If we are only using one pipe, or no pipe at
|
||||||
|
# all, using select() or threads is unnecessary.
|
||||||
|
if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
|
||||||
|
stdout = None
|
||||||
|
stderr = None
|
||||||
|
if self.stdin:
|
||||||
|
if input:
|
||||||
|
self.stdin.write(input)
|
||||||
|
self.stdin.close()
|
||||||
|
elif self.stdout:
|
||||||
|
stdout = self.stdout.read()
|
||||||
|
elif self.stderr:
|
||||||
|
stderr = self.stderr.read()
|
||||||
|
self.wait()
|
||||||
|
return (stdout, stderr)
|
||||||
|
|
||||||
|
return self._communicate(input)
|
||||||
|
|
||||||
|
|
||||||
if mswindows:
|
if mswindows:
|
||||||
#
|
#
|
||||||
|
@ -811,14 +838,7 @@ class Popen(object):
|
||||||
buffer.append(fh.read())
|
buffer.append(fh.read())
|
||||||
|
|
||||||
|
|
||||||
def communicate(self, input=None):
|
def _communicate(self, input):
|
||||||
"""Interact with process: Send data to stdin. Read data from
|
|
||||||
stdout and stderr, until end-of-file is reached. Wait for
|
|
||||||
process to terminate. The optional input argument should be a
|
|
||||||
string to be sent to the child process, or None, if no data
|
|
||||||
should be sent to the child.
|
|
||||||
|
|
||||||
communicate() returns a tuple (stdout, stderr)."""
|
|
||||||
stdout = None # Return
|
stdout = None # Return
|
||||||
stderr = None # Return
|
stderr = None # Return
|
||||||
|
|
||||||
|
@ -1066,14 +1086,7 @@ class Popen(object):
|
||||||
return self.returncode
|
return self.returncode
|
||||||
|
|
||||||
|
|
||||||
def communicate(self, input=None):
|
def _communicate(self, input):
|
||||||
"""Interact with process: Send data to stdin. Read data from
|
|
||||||
stdout and stderr, until end-of-file is reached. Wait for
|
|
||||||
process to terminate. The optional input argument should be a
|
|
||||||
string to be sent to the child process, or None, if no data
|
|
||||||
should be sent to the child.
|
|
||||||
|
|
||||||
communicate() returns a tuple (stdout, stderr)."""
|
|
||||||
read_set = []
|
read_set = []
|
||||||
write_set = []
|
write_set = []
|
||||||
stdout = None # Return
|
stdout = None # Return
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue