-
-
Notifications
You must be signed in to change notification settings - Fork 32.1k
subprocess.run(), subprocess.Popen() should accept file descriptor as cwd parameter #91183
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
subprocess.run() and subprocess.Popen() accepts a cwd= parameter to change directory before running the subprocess. Unfortunately it's not possible to use a file descriptor to run the subprocess in a directory already opened. For example: import os
import subprocess
with os.open('/usr/bin', os.O_RDONLY) as f:
subprocess.run(["ls", "-l"], cwd=f, check=True) fails with Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.9/subprocess.py", line 505, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.9/subprocess.py", line 1754, in _execute_child
self.pid = _posixsubprocess.fork_exec( Using a file descriptor instead of path is useful to address TOCTOU issues. Maybe a mean to convert a file descriptor to a Path-like object would do the trick. |
Basically you want it to call fchdir() instead of chdir() when passed a fd (integer) instead of a string/Path-like. That makes sense and should be a reasonably straight forward set of changes to _posixsubprocess.c. (A way to convert a fd into a Path-like object would _not_ work as that'd reintroduce the TOCTOU on the directory - that'd be a pathlib feature request anyways, not a subprocess one) |
I looked at posixmodule: os.chdir() accepts a file descriptor. |
this mostly requires plumbing to accept an int as the cwd and plumb that through to the between fork and exec code to call the Modules/_posixsubprocess.c internals are a bit of a mess today with a bazillion parameters passed to internal functions which makes this a pain... I want to refactor things to use a struct and not need that, but adding this feature is doable regardless. |
For python 3.12 ? |
For python 3.15 ? |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: