subprocess.Popen inheriting
Aaron Brady
castironpi at gmail.com
Wed Dec 17 19:46:32 EST 2008
On Dec 17, 5:05 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Wed, 17 Dec 2008 12:21:38 -0200, Jeremy Sanders
> <jeremy+complangpyt... at jeremysanders.net> escribió:
>
> > Aaron Brady wrote:
>
> >> I thought so too. The web seems to say that on Linux they are, and on
> >> Windows, you need to call DuplicateHandle for it.
>
> Or set bInheritHandle=True when creating the pipe initially. os.pipe()
> doesn't do that.
>
> > I hit this problem - it looks like pipes aren't very versatile on
> > Windows.
> > There's also the complicating factor that the handles in windows aren't
> > the
> > same as the file numbers that Python uses, so you have to convert between
> > them.
>
> > It would be nice if Python created pipes that are properly inheritable by
> > default by child processes, as they're mostly used for IPC.
>
> I'd say it is a bug in os.pipe implementation; they should be inheritable
> by default, as in posix (after all, the code is in "posixmodule.c").
The code looks like this:
ok = CreatePipe(&read, &write, NULL, 0);
Py_END_ALLOW_THREADS
if (!ok)
return win32_error("CreatePipe", NULL);
read_fd = _open_osfhandle((Py_intptr_t)read, 0);
write_fd = _open_osfhandle((Py_intptr_t)write, 1);
'If lpPipeAttributes is NULL, the handle cannot be inherited.' You
could populate a 'SECURITY_ATTRIBUTES' structure, or call
DuplicateHandle on both of them.
A patch would look like this:
SECURITY_ATTRIBUTES sattribs;
sattribs.nLength = sizeof(sattribs);
sattribs.lpSecurityDescriptor = NULL;
sattribs.bInheritHandle = TRUE;
ok = CreatePipe(&read, &write, &sattribs, 0);
This still doesn't answer whether the file descriptor return by
'_open_osfhandle' can be inherited too.
More information about the Python-list
mailing list