This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Improper subprocess output of arguments with braces in them on windows
Type: Stage: resolved
Components: Windows Versions: Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: Anthony Sottile, eryksun, paul.moore, steve.dower, tim.golden, zach.ware, Александр Бондарев
Priority: normal Keywords:

Created on 2015-12-07 02:49 by Anthony Sottile, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (8)
msg256043 - (view) Author: Anthony Sottile (Anthony Sottile) * Date: 2015-12-07 02:49
First some expected output:

```
# from cmd.exe
C:\Users\Anthony>echo hi{1}
hi{1}
# from MINGW
$ echo hi{1}
hi{1}
```

```
# On ubuntu
$ echo 'hi{1}'
hi{1}
$ python3.5 -c "import subprocess; print(subprocess.check_output(('echo', 'hi{1}')))"
b'hi{1}\n'
```

Now for the unexpected output (produced only by python on windows) (notice the missing braces)

```
C:\Python27\python.exe -c "import subprocess; print(subprocess.check_output(('echo', 'hi{1}')))"
hi1
C:\Python34\python.exe -c "import subprocess; print(subprocess.check_output(('echo', 'hi{1}')))"
b'hi1\n'
C:\Python35\python.exe -c "import subprocess; print(subprocess.check_output(('echo', 'hi{1}')))"
b'hi1\n'
```

Peculiarly, these all produce the output I expect:

```
C:\Python35\python.exe -c "import subprocess; print(subprocess.check_output(('echo', 'hi {1}')))"
b'hi {1}\n'
C:\Python35\python.exe -c "import subprocess; print(subprocess.check_output(('echo', 'hi{1}'), shell=True))"
b'hi{1}\r\n'
```

I don't have access to 3.6, but I imagine the issue exists there too.
msg256044 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2015-12-07 03:16
Using the cmd shell's "echo" command requires shell=True. You must have an "echo.exe" somewhere in your PATH. Check "where echo" in cmd.
msg256045 - (view) Author: Anthony Sottile (Anthony Sottile) * Date: 2015-12-07 03:45
It *is* in my path (otherwise it wouldn't produce any output at all).  I'm not trying to use the shell builtin, I'm trying to use the executable.
msg256046 - (view) Author: Anthony Sottile (Anthony Sottile) * Date: 2015-12-07 03:48
To clarify further, the echo.exe on my path reacts correctly:

```
Anthony@AnthonysDesktop MINGW64 ~/Desktop/git/pre-commit (allow_curly_braces_in_args)
$ /usr/bin/echo hi{1}
hi{1}
Anthony@AnthonysDesktop MINGW64 ~/Desktop/git/pre-commit (allow_curly_braces_in_args)
$ 'C:\Users\Anthony\AppData\Local\Programs\Git\usr\bin\echo.exe' hi{1}
hi{1}

```
msg256047 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2015-12-07 04:54
AFAICT, there's no place where subprocess.Popen would be responsible for removing braces from the output. I think it's something unusual with the "echo.exe" program. In the cmd.exe shell -- i.e. no msys, bash, etc -- what do you get for the following?

    C:\Users\Anthony\AppData\Local\Programs\Git\usr\bin\echo.exe hi{1}
msg256048 - (view) Author: Anthony Sottile (Anthony Sottile) * Date: 2015-12-07 05:03
```
C:\Users\Anthony> C:\Users\Anthony\AppData\Local\Programs\Git\usr\bin\echo.exe hi{1}
hi1
```

Must be the provider of echo.exe.  I'll take it up with them

Sorry for the trouble!
msg319596 - (view) Author: Александр Бондарев (Александр Бондарев) Date: 2018-06-15 08:33
Can you please re-open this bug?
I'm not agree that this a correct behavior.
Usually we are using subprocess.check_output([..]) version to not aware about argument escaping and it works good for Linux.

In example:
> subprocess.check_output(['echo', "'hello'"])
"'hello'"

But:
> subprocess.check_output("echo 'hello'", shell=True)
'hello'

I'm expecting same behavior on Windows system, but:
> subprocess.check_output(['echo', "'hello'"])
'hello'
> subprocess.check_output("echo 'hello'", shell=True)
'hello'

and 
> subprocess.check_output(['echo', "'@{u}'"])
'@{u}'
> subprocess.check_output(['echo', "@{u}"])
'@u'

and it even more confusing:

> subprocess.check_output(['echo', " @{u}"])
' @{u}'

because if it detects some spaces in argument then it tries to quote this and it is correct behavior, but it should also care about other kind of characters to escape.

We definitely should bring more love for Windows!
msg319599 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2018-06-15 09:04
With a stock Windows system, `subprocess.check_output(['echo', "'hello'"])` fails because there is no "echo.exe". That's a 3rd party program that you installed. `subprocess.check_output("echo 'hello'", shell=True)` uses the CMD shell's internal `echo` command, which doesn't strip quotes from the string.

subprocess.list2cmdline implements quoting that's meant for applications that use the VC++ [w]main argv array, or the CommandLineToArgvW WinAPI function. It can't take into account custom command-line parsing of all applications. If this echo.exe doesn't work right with an args list, then use a custom command line -- *without* shell=True.
History
Date User Action Args
2022-04-11 14:58:24adminsetgithub: 70001
2018-06-15 09:04:27eryksunsetmessages: + msg319599
2018-06-15 08:33:14Александр Бондаревsetnosy: + Александр Бондарев
messages: + msg319596
2015-12-07 05:08:54zach.waresetstage: resolved
2015-12-07 05:03:19Anthony Sottilesetstatus: open -> closed
resolution: not a bug
messages: + msg256048
2015-12-07 04:54:54eryksunsetmessages: + msg256047
2015-12-07 03:48:59Anthony Sottilesetmessages: + msg256046
2015-12-07 03:45:38Anthony Sottilesetstatus: closed -> open
resolution: not a bug -> (no value)
messages: + msg256045
2015-12-07 03:26:25abarrysetstatus: open -> closed
resolution: not a bug
2015-12-07 03:16:57eryksunsetnosy: + eryksun
messages: + msg256044
2015-12-07 02:50:00Anthony Sottilecreate