subprocess.Popen inheriting

Aaron Brady castironpi at gmail.com
Sat Dec 20 20:06:24 EST 2008


On Dec 18, 7:21 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Thu, 18 Dec 2008 19:46:45 -0200, Aaron Brady <castiro... at gmail.com>  
> escribió:
snip
> On Windows, file handles are the real OS stuff, the "true" reference to an  
> open file. File descriptors are not, they exist only to please the C  
> runtime library. Programs not written in C (directly, or indirectly like  
> Python) don't care at all about file descriptors. And in case one actually  
> cares, there is _open_osfhandle in the C RTL (available as  
> msvcrt.open_osfhandle from Python).
> A subprocess may inherit handles from its parent [there are two filters:  
> the parameter "bInheritHandles" in the CreateProcess call provides global  
> control, and individual handles can be made inheritable or not, before  
> creating the new subprocess].
> "Anonymous" pipes are good to replace stdin/stdout/stderr, because there  
> is no need to explicitely communicate the handle value to the subprocess:  
> one just replaces the corresponding handle with the desired pipe, and the  
> subprocess might not even notice it.
> In case this is not enough, one might pass the handle (as a number) in the  
> command line, but probably a "named pipe" would be better. As this is not  
> transparent for the child process, one must explicitely code such things.
>
> > Will it take calling
> > 'CreatePipe' from ctypes directly if on Windows?  Or can 'os.pipe' be
> > made to abstract that?  If Windows can't inherit descriptors,
> > 'os.pipe' should return handles, and 'os.read' &co. should accept
> > them.
>
> I think the best way would be to modify os.pipe so it returns inheritable  
> pipes, as it should have been from the beginning.
>
> > It is a fairly large patch.
>
> Not at all, you have already posted most of it.

I have marginally tested the patch on a custom build.  It works, but
there is a catch.  The descriptor can't be passed directly to the
child on the command line.  You need to call 'msvcrt.get_osfhandle' on
the descriptor, pass the result, then call 'msvcrt.open_osfhandle' in
the child.



More information about the Python-list mailing list