En Thu, 18 Dec 2008 19:46:45 -0200, Aaron Brady <
[email protected]>
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.