--- py3k/Lib/subprocess.py 2009-07-22 10:49:55.000000000 +0800 +++ py3k/Lib/subprocess.py.new 2009-07-24 15:38:22.000000000 +0800 @@ -585,7 +585,7 @@ class Popen(object): stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, - startupinfo=None, creationflags=0): + startupinfo=None, creationflags=0, pass_fds=()): """Create new Popen instance.""" _cleanup() @@ -639,7 +639,7 @@ class Popen(object): errread, errwrite) = self._get_handles(stdin, stdout, stderr) self._execute_child(args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, + pass_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, @@ -804,7 +804,7 @@ class Popen(object): def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, + pass_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, @@ -1013,13 +1013,18 @@ class Popen(object): fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) - def _close_fds(self, but): - os.closerange(3, but) - os.closerange(but + 1, MAXFD) + def _close_fds(self, pass_fds): + for i in range(3, MAXFD): + if i in pass_fds: + continue + try: + os.close(i) + except: + pass def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, + pass_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, @@ -1089,7 +1094,7 @@ class Popen(object): # Close all other fds, if asked for if close_fds: - self._close_fds(but=errpipe_write) + self._close_fds(pass_fds+(errpipe_write,)) if cwd is not None: os.chdir(cwd)