Index: Lib/popen2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/popen2.py,v retrieving revision 1.26 diff -c -r1.26 popen2.py *** Lib/popen2.py 2 Jun 2003 19:12:01 -0000 1.26 --- Lib/popen2.py 1 Jul 2003 03:29:15 -0000 *************** *** 19,24 **** --- 19,31 ---- for inst in _active[:]: inst.poll() + def _cleanup_fds(fdlist): + for fd in fdlist: + try: + os.close(fd) + except OSError: + pass + class Popen3: """Class representing a child process. Normally instances are created by the factory functions popen2() and popen3().""" *************** *** 33,68 **** specifies the size of the I/O buffers to/from the child process.""" _cleanup() p2cread, p2cwrite = os.pipe() ! c2pread, c2pwrite = os.pipe() if capturestderr: ! errout, errin = os.pipe() ! self.pid = os.fork() ! if self.pid == 0: ! # Child ! os.dup2(p2cread, 0) ! os.dup2(c2pwrite, 1) if capturestderr: ! os.dup2(errin, 2) ! self._run_child(cmd) ! os.close(p2cread) ! self.tochild = os.fdopen(p2cwrite, 'w', bufsize) ! os.close(c2pwrite) ! self.fromchild = os.fdopen(c2pread, 'r', bufsize) ! if capturestderr: ! os.close(errin) ! self.childerr = os.fdopen(errout, 'r', bufsize) ! else: ! self.childerr = None ! _active.append(self) def _run_child(self, cmd): if isinstance(cmd, basestring): cmd = ['/bin/sh', '-c', cmd] ! for i in range(3, MAXFD): ! try: ! os.close(i) ! except OSError: ! pass try: os.execvp(cmd[0], cmd) finally: --- 40,83 ---- specifies the size of the I/O buffers to/from the child process.""" _cleanup() p2cread, p2cwrite = os.pipe() ! try: ! c2pread, c2pwrite = os.pipe() ! except: ! _cleanup_fds([p2cread, p2cwrite]) ! raise if capturestderr: ! try: ! errout, errin = os.pipe() ! except: ! _cleanup_fds([p2cread, p2cwrite, c2pread, c2pwrite]) ! raise ! try: ! self.pid = os.fork() ! if self.pid == 0: ! # Child ! os.dup2(p2cread, 0) ! os.dup2(c2pwrite, 1) ! if capturestderr: ! os.dup2(errin, 2) ! self._run_child(cmd) ! os.close(p2cread) ! self.tochild = os.fdopen(p2cwrite, 'w', bufsize) ! os.close(c2pwrite) ! self.fromchild = os.fdopen(c2pread, 'r', bufsize) if capturestderr: ! os.close(errin) ! self.childerr = os.fdopen(errout, 'r', bufsize) ! else: ! self.childerr = None ! _active.append(self) ! except: ! _cleanup_fds([p2cread, c2pwrite, errin]) ! raise def _run_child(self, cmd): if isinstance(cmd, basestring): cmd = ['/bin/sh', '-c', cmd] ! _cleanup_fds(range(3, MAXFD)) try: os.execvp(cmd[0], cmd) finally: *************** *** 97,115 **** def __init__(self, cmd, bufsize=-1): _cleanup() p2cread, p2cwrite = os.pipe() ! c2pread, c2pwrite = os.pipe() ! self.pid = os.fork() ! if self.pid == 0: ! # Child ! os.dup2(p2cread, 0) ! os.dup2(c2pwrite, 1) ! os.dup2(c2pwrite, 2) ! self._run_child(cmd) ! os.close(p2cread) ! self.tochild = os.fdopen(p2cwrite, 'w', bufsize) ! os.close(c2pwrite) ! self.fromchild = os.fdopen(c2pread, 'r', bufsize) ! _active.append(self) if sys.platform[:3] == "win" or sys.platform == "os2emx": --- 112,139 ---- def __init__(self, cmd, bufsize=-1): _cleanup() p2cread, p2cwrite = os.pipe() ! try: ! c2pread, c2pwrite = os.pipe() ! except: ! _cleanup_fds([p2cread, p2cwrite]) ! raise ! ! try: ! self.pid = os.fork() ! if self.pid == 0: ! # Child ! os.dup2(p2cread, 0) ! os.dup2(c2pwrite, 1) ! os.dup2(c2pwrite, 2) ! self._run_child(cmd) ! os.close(p2cread) ! self.tochild = os.fdopen(p2cwrite, 'w', bufsize) ! os.close(c2pwrite) ! self.fromchild = os.fdopen(c2pread, 'r', bufsize) ! _active.append(self) ! except: ! _cleanup_fds([p2cread, p2cwrite, c2pread, c2pwrite]) ! raise if sys.platform[:3] == "win" or sys.platform == "os2emx":