castironpi at gmail.com
Sun Dec 21 02:06:24 CET 2008
On Dec 18, 7:21 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
> En Thu, 18 Dec 2008 19:46:45 -0200, Aaron Brady <castiro... at gmail.com>
> 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
More information about the Python-list