New submission from STINNER Victor <vstin...@python.org>:
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 <rep...@bugs.python.org> <https://bugs.python.org/issue42648> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com