Python subprocess issue with ampersands

2019-07-05 23:40发布

I'm currently having a major issue with a python script. The script runs arbitrary commands through a handler to convert incorrect error reporting into correct error reporting.

The issue I'm having is getting the script to work correctly on windows with a command that contains ampersands in it's path. I've attempted quoting the command, escaping the ampersand with ^ and neither works. I'm now out of ideas. Any suggestions?

To clarify from current responses:

  1. I am using the subprocess module
  2. I am passing the command line + arguments in as a list
  3. The issue is with the path to the command itself, not any of the arguments
  4. I've tried quoting the command. It causes a [Error 123] The filename, directory name, or volume label syntax is incorrect error
  5. I'm using no shell argument (so shell=false)
  6. In case it matters, I'm grabbing a pipe to stderr for processing it, but ignoring stdout and stdin
  7. It is only for use on Windows currently, and works as expected in all other cases that I've tested so far.
  8. The command that is failing is:

p = subprocess.Popen(prog, stderr = subprocess.PIPE, bufsize=-1)

when the first element of the list 'prog' contains any ampersands. Quoting this first string does not work.

6条回答
女痞
2楼-- · 2019-07-06 00:16

A proper answer will need more information than that. What are you actually doing? How does it fail? Are you using the subprocess module? Are you passing a list of arguments and shell=False (or no shell argument) or are you actually invoking the shell?

查看更多
Root(大扎)
3楼-- · 2019-07-06 00:20

"escaping the ampersand with ^"

Are you sure ^ is an escape character to Windows? Shouldn't you use \?

查看更多
forever°为你锁心
4楼-- · 2019-07-06 00:25

I try a situation as following:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

This does work.

查看更多
疯言疯语
5楼-- · 2019-07-06 00:26

To answer my own question:

Quoting the actual command when passing the parameters as a list doesn't work correctly (command is first item of list) so to solve the issue I turned the list into a space separated string and passed that into subprocess instead.

Better solutions still welcomed.

查看更多
贼婆χ
6楼-- · 2019-07-06 00:36

Try quoting the argument that contains the &

wget "http://foo.com/?bar=baz&baz=bar"

Is usually what has to be done in a Linux shell

查看更多
Animai°情兽
7楼-- · 2019-07-06 00:37

Make sure you are using lists and no shell expansion:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)
查看更多
登录 后发表回答