diff options
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) |