diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-05-28 19:49:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-28 19:49:35 (GMT) |
commit | 9e3c4526394856d6376eed4968d27d53e1d69b7d (patch) | |
tree | 709efb00303c937b13b77cec4e2d510d5f15811c /Lib/subprocess.py | |
parent | 1b05aa219041eb1c9dbcb4ec6c1fa5b20f060bf5 (diff) | |
download | cpython-9e3c4526394856d6376eed4968d27d53e1d69b7d.zip cpython-9e3c4526394856d6376eed4968d27d53e1d69b7d.tar.gz cpython-9e3c4526394856d6376eed4968d27d53e1d69b7d.tar.bz2 |
bpo-31961: Fix support of path-like executables in subprocess. (GH-5914)
Diffstat (limited to 'Lib/subprocess.py')
-rw-r--r-- | Lib/subprocess.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 6cc9eb3..9e36b9d 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -521,7 +521,7 @@ def list2cmdline(seq): # "Parsing C++ Command-Line Arguments" result = [] needquote = False - for arg in seq: + for arg in map(os.fsdecode, seq): bs_buf = [] # Add a space to separate this argument from the others @@ -1203,9 +1203,23 @@ class Popen(object): assert not pass_fds, "pass_fds not supported on Windows." - if not isinstance(args, str): + if isinstance(args, str): + pass + elif isinstance(args, bytes): + if shell: + raise TypeError('bytes args is not allowed on Windows') + args = list2cmdline([args]) + elif isinstance(args, os.PathLike): + if shell: + raise TypeError('path-like args is not allowed when ' + 'shell is true') + args = list2cmdline([args]) + else: args = list2cmdline(args) + if executable is not None: + executable = os.fsdecode(executable) + # Process startup details if startupinfo is None: startupinfo = STARTUPINFO() @@ -1262,7 +1276,7 @@ class Popen(object): int(not close_fds), creationflags, env, - os.fspath(cwd) if cwd is not None else None, + os.fsdecode(cwd) if cwd is not None else None, startupinfo) finally: # Child is launched. Close the parent's copy of those pipe @@ -1510,6 +1524,11 @@ class Popen(object): if isinstance(args, (str, bytes)): args = [args] + elif isinstance(args, os.PathLike): + if shell: + raise TypeError('path-like args is not allowed when ' + 'shell is true') + args = [args] else: args = list(args) |