Gregory P. Smith added the comment:

easy enough to reproduce...

$ ./python.exe -c 'import os, subprocess as s; os.close(0); os.close(1); 
s.Popen(["/bin/true"])'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/gps/python/hg/default/Lib/subprocess.py", line 818, in __init__
    restore_signals, start_new_session)
  File "/Users/gps/python/hg/default/Lib/subprocess.py", line 1363, in 
_execute_child
    restore_signals, start_new_session, preexec_fn)
ValueError: errpipe_write must be >= 3

Examining the code, it looks like that restriction is to prevent the dup2's for 
any passed in stdin, stdout or stderr pipes from overwriting errpipe_write in 
Modules/_posixsubprocess.c's child_exec() function.

First guess at a fix: child_exec() needs to detect this situation and 
dup(errpipe_write) until it gets a fd not in the 0..2 range before the 
dup2(...) calls that could otherwise blindly clobber it.  This could possibly 
be done by the parent process's _create_pipe() in Lib/subprocess.py when 
allocating the errpipe_read and errpipe_write fds.

Suggested Workaround: for now for any code running into this (Python daemons 
launching subprocesses?) - Call os.pipe() twice at the start of your program to 
burn 4 fds.  That'll guarantee 0, 1 and 2 will not be used for this pipe.

----------
assignee:  -> gregory.p.smith
versions: +Python 3.3

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue15798>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to