Issue #8513: os.get_exec_path() supports b'PATH' key and bytes value.
subprocess.Popen() and os._execvpe() support bytes program name. Add
os.supports_bytes_environ flag: True if the native OS type of the environment
is bytes (eg. False on Windows).
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 14f1f67..adbee0b 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1096,15 +1096,14 @@
for k, v in env.items()]
else:
env_list = None # Use execv instead of execve.
+ executable = os.fsencode(executable)
if os.path.dirname(executable):
- executable_list = (os.fsencode(executable),)
+ executable_list = (executable,)
else:
# This matches the behavior of os._execvpe().
- path_list = os.get_exec_path(env)
- executable_list = (os.path.join(dir, executable)
- for dir in path_list)
- executable_list = tuple(os.fsencode(exe)
- for exe in executable_list)
+ executable_list = tuple(
+ os.path.join(os.fsencode(dir), executable)
+ for dir in os.get_exec_path(env))
self.pid = _posixsubprocess.fork_exec(
args, executable_list,
close_fds, cwd, env_list,