New submission from STINNER Victor <[email protected]>:
While working on on bpo-42641 "Deprecate os.popen() function", I tried to
replace os.popen() with a subprocess function, to avoid relying on an external
shell. Example from test_posix:
with os.popen('id -G 2>/dev/null') as idg:
groups = idg.read().strip()
ret = idg.close()
os.popen() uses a shell, and so returns an non-zero exit status if the "id"
program is not available:
>>> import os; os.popen('nonexistent').close()
/bin/sh: nonexistent : commande introuvable
32512
whereas the subprocess module raises an OSError:
>>> import subprocess; proc=subprocess.run('nonexistent')
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent'
It's not convenient to have to write try/except OSError when replacing
os.popen() with subprocess.run().
It would be convenient to have a subprocess API which avoid the need for
try/except, if possible with keeping the ability to distinguish when exec()
fails and when exec() completed but waitpid() returns a non-zero exit status
(child process exit code is non-zero).
This issue becomes more interesting when subprocess uses os.posix_spawn(). The
subprocess module only uses os.posix_spawn() if the libc implementation is
known to report exec() failure: if os.posix_spawn() raises an OSError exception
if exec() fails. See subprocess._use_posix_spawn() which uses
os.confstr('CS_GNU_LIBC_VERSION') to check if the glibc 2.24+ is used.
Or maybe I simply missed a very obvious API in subprocess for this problem?
----------
components: Library (Lib)
messages: 383078
nosy: gregory.p.smith, vstinner
priority: normal
severity: normal
status: open
title: subprocess: add a helper/parameter to catch exec() OSError exception
versions: Python 3.10
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue42648>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com