diff options
Diffstat (limited to 'Lib/subprocess.py')
| -rw-r--r-- | Lib/subprocess.py | 62 | 
1 files changed, 11 insertions, 51 deletions
| diff --git a/Lib/subprocess.py b/Lib/subprocess.py index aa3e217..c66bd63 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -396,8 +396,6 @@ if mswindows:          hStdOutput = None          hStdError = None          wShowWindow = 0 -    class pywintypes: -        error = IOError  else:      import select      _has_poll = hasattr(select, 'poll') @@ -821,7 +819,7 @@ class Popen(object):              for f in filter(None, (self.stdin, self.stdout, self.stderr)):                  try:                      f.close() -                except EnvironmentError: +                except OSError:                      pass  # Ignore EBADF or other errors.              # Make sure the child pipes are closed as well. @@ -835,7 +833,7 @@ class Popen(object):              for fd in to_close:                  try:                      os.close(fd) -                except EnvironmentError: +                except OSError:                      pass              raise @@ -899,7 +897,7 @@ class Popen(object):                  if input:                      try:                          self.stdin.write(input) -                    except IOError as e: +                    except OSError as e:                          if e.errno != errno.EPIPE and e.errno != errno.EINVAL:                              raise                  self.stdin.close() @@ -1031,23 +1029,6 @@ class Popen(object):              return Handle(h) -        def _find_w9xpopen(self): -            """Find and return absolut path to w9xpopen.exe""" -            w9xpopen = os.path.join( -                            os.path.dirname(_winapi.GetModuleFileName(0)), -                                    "w9xpopen.exe") -            if not os.path.exists(w9xpopen): -                # Eeek - file-not-found - possibly an embedding -                # situation - see if we can locate it in sys.exec_prefix -                w9xpopen = os.path.join(os.path.dirname(sys.base_exec_prefix), -                                        "w9xpopen.exe") -                if not os.path.exists(w9xpopen): -                    raise RuntimeError("Cannot locate w9xpopen.exe, which is " -                                       "needed for Popen to work with your " -                                       "shell or platform.") -            return w9xpopen - -          def _execute_child(self, args, executable, preexec_fn, close_fds,                             pass_fds, cwd, env,                             startupinfo, creationflags, shell, @@ -1076,21 +1057,6 @@ class Popen(object):                  startupinfo.wShowWindow = _winapi.SW_HIDE                  comspec = os.environ.get("COMSPEC", "cmd.exe")                  args = '{} /c "{}"'.format (comspec, args) -                if (_winapi.GetVersion() >= 0x80000000 or -                        os.path.basename(comspec).lower() == "command.com"): -                    # Win9x, or using command.com on NT. We need to -                    # use the w9xpopen intermediate program. For more -                    # information, see KB Q150956 -                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) -                    w9xpopen = self._find_w9xpopen() -                    args = '"%s" %s' % (w9xpopen, args) -                    # Not passing CREATE_NEW_CONSOLE has been known to -                    # cause random failures on win9x.  Specifically a -                    # dialog: "Your program accessed mem currently in -                    # use at xxx" and a hopeful warning about the -                    # stability of your system.  Cost is Ctrl+C won't -                    # kill children. -                    creationflags |= _winapi.CREATE_NEW_CONSOLE              # Start the process              try: @@ -1102,12 +1068,6 @@ class Popen(object):                                           env,                                           cwd,                                           startupinfo) -            except pywintypes.error as e: -                # Translate pywintypes.error to WindowsError, which is -                # a subclass of OSError.  FIXME: We should really -                # translate errno using _sys_errlist (or similar), but -                # how can this be done from Python? -                raise WindowsError(*e.args)              finally:                  # Child is launched. Close the parent's copy of those pipe                  # handles that only the child should have open.  You need @@ -1192,7 +1152,7 @@ class Popen(object):                  if input is not None:                      try:                          self.stdin.write(input) -                    except IOError as e: +                    except OSError as e:                          if e.errno != errno.EPIPE:                              raise                  self.stdin.close() @@ -1412,13 +1372,13 @@ class Popen(object):                      exception_name, hex_errno, err_msg = (                              errpipe_data.split(b':', 2))                  except ValueError: -                    exception_name = b'RuntimeError' +                    exception_name = b'SubprocessError'                      hex_errno = b'0'                      err_msg = (b'Bad exception data from child: ' +                                 repr(errpipe_data))                  child_exception_type = getattr(                          builtins, exception_name.decode('ascii'), -                        RuntimeError) +                        SubprocessError)                  err_msg = err_msg.decode(errors="surrogatepass")                  if issubclass(child_exception_type, OSError) and hex_errno:                      errno_num = int(hex_errno, 16) @@ -1448,11 +1408,11 @@ class Popen(object):                  self.returncode = _WEXITSTATUS(sts)              else:                  # Should never happen -                raise RuntimeError("Unknown child exit status!") +                raise SubprocessError("Unknown child exit status!")          def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, -                _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD): +                _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):              """Check if child process has terminated.  Returns returncode              attribute. @@ -1465,7 +1425,7 @@ class Popen(object):                      pid, sts = _waitpid(self.pid, _WNOHANG)                      if pid == self.pid:                          self._handle_exitstatus(sts) -                except _os_error as e: +                except OSError as e:                      if _deadstate is not None:                          self.returncode = _deadstate                      elif e.errno == _ECHILD: @@ -1622,7 +1582,7 @@ class Popen(object):                      raise TimeoutExpired(self.args, orig_timeout)                  try:                      ready = poller.poll(timeout) -                except select.error as e: +                except OSError as e:                      if e.args[0] == errno.EINTR:                          continue                      raise @@ -1690,7 +1650,7 @@ class Popen(object):                      (rlist, wlist, xlist) = \                          select.select(self._read_set, self._write_set, [],                                        timeout) -                except select.error as e: +                except OSError as e:                      if e.args[0] == errno.EINTR:                          continue                      raise | 
