[issue29472] subprocess.communicate with timeout 0 and already terminated process generates TimeoutExpired on Linux

Maurice van der Pot report at bugs.python.org
Tue Feb 7 06:57:14 EST 2017


New submission from Maurice van der Pot:

This only happens when:
- timeout is small enough
- at least one stream is redirected to a PIPE

When I know for certain that a subprocess has already terminated and I call communicate to retrieve its results with a timeout of 0 (or other small enough value), communicate will always return TimeoutExpired.

The cause is that the check on timeout is done before the ready file descriptors are checked: https://hg.python.org/cpython/file/tip/Lib/subprocess.py#l1484. With a small enough timeout, communicate will never check the file descriptors for EOF.

>From a user perspective I would expect to be able to use communicate(timeout=0) to get the output for a process that I know has already terminated or to poll without blocking.

Is this the intended behaviour of communicate or is it a bug? To me this behaviour is surprising.

----------
components: Library (Lib)
messages: 287230
nosy: Griffon26
priority: normal
severity: normal
status: open
title: subprocess.communicate with timeout 0 and already terminated process generates TimeoutExpired on Linux
type: behavior
versions: Python 3.6

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue29472>
_______________________________________


More information about the Python-bugs-list mailing list