Title: subprocess: document the interaction between subprocess.Popen and os.set_inheritable
Type: Stage: resolved
Components: Documentation Versions: Python 3.6
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: docs@python Nosy List: docs@python, gregory.p.smith, martin.panter, sloonz
Priority: normal Keywords: patch

Created on 2018-03-15 10:20 by sloonz, last changed 2018-03-25 17:44 by gregory.p.smith. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 6240 open gregory.p.smith, 2018-03-25 17:28
Messages (4)
msg313868 - (view) Author: Simon Lipp (sloonz) Date: 2018-03-15 10:20
From current `os` documentation:

> A file descriptor has an “inheritable” flag which indicates if the file descriptor can be inherited by child processes

from current `subprocess` documentation:

> If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed

It would be helpful to explicitly specify that subprocess.Popen does not takes into account the inheritable flag ; thas is, that inheritable fds will still be closed with open_fds = False, and that non-inheritable fds will still be kept with open_fds = True.
msg314416 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2018-03-25 14:26
There is no “open_fds” parameter as far as I know. I presume you meant heritable descriptors are still closed with close_fds=True (not open_fds=False).

Are you sure about the second part? In my experiments on Linux, unless I use “pass_fds” or one of the “stdin” etc parameters, a non-heritable descriptor is never passed to the child, no matter what I use for “close_fds”.

Reading through Issue 6559, the intention of “pass_fds” seems to be to list extra file descriptors, in addition to 0, 1 and 2 that are normally passed. The documentation says descriptors greater than 2 are closed (due to close_fds=True), but in reality the “pass_fds” descriptors seem to be always left open, even when they are marked non-heritable.
msg314422 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2018-03-25 17:37
I assumed simon meant "close_fds=False" when he wrote open_fds = True.

Regardless, supplying any pass_fds forces close_fds=True behavior.

File descriptors listed in pass_fds are explicitly set inheritable from within the child process prior to calling exec().  See the start of child_exec() within Modules/_posixsubprocess.c.
msg314423 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2018-03-25 17:44
I clarified the docs to mention that the inheritable flag is heeded when close_fds=False in
Date User Action Args
2018-03-25 17:44:07gregory.p.smithsetstatus: open -> closed
resolution: fixed
messages: + msg314423

stage: patch review -> resolved
2018-03-25 17:37:50gregory.p.smithsetmessages: + msg314422
2018-03-25 17:28:01gregory.p.smithsetkeywords: + patch
stage: patch review
pull_requests: + pull_request5976
2018-03-25 14:26:27martin.pantersetnosy: + martin.panter
messages: + msg314416
2018-03-16 02:18:16ned.deilysetnosy: + gregory.p.smith
2018-03-15 10:20:38sloonzcreate