&符号的Python子流程问题

时间:2008-09-23 12:28:40

标签: python windows subprocess command-line-arguments

我目前遇到一个python脚本的主要问题。该脚本通过处理程序运行任意命令,以将错误的错误报告转换为正确的错误报告。

我遇到的问题是让脚本在Windows上正常工作,其命令在其路径中包含&符号。我试图引用命令,用^来逃避&符号,但都不起作用。我现在已经没想法了。有什么建议吗?

从目前的回应中澄清:

  1. 我正在使用子流程模块
  2. 我将命令行+参数作为列表传递
  3. 问题在于命令本身的路径,而不是任何参数
  4. 我试过引用命令。它会导致[Error 123] The filename, directory name, or volume label syntax is incorrect错误
  5. 我没有使用shell参数(所以shell=false
  6. 如果重要的话,我会抓住一根管子去stderr处理它,但忽略了stdout和stdin
  7. 目前只在Windows上使用,并且在我迄今为止测试过的所有其他情况下都能按预期工作。
  8. 失败的命令是:
  9.   

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

    当列表'prog'的第一个元素包含任何&符号时。引用第一个字符串不起作用。

6 个答案:

答案 0 :(得分:5)

确保使用列表而不使用shell扩展:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)

答案 1 :(得分:1)

正确答案需要更多信息。你在干什么?它怎么会失败?你在使用子进程模块吗?你是否传递了一个参数列表和shell = False(或没有shell参数),或者你实际上正在调用shell?

答案 2 :(得分:1)

尝试引用包含&

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

通常是必须在Linux shell中完成的事情

答案 3 :(得分:1)

“用^”逃避&符号

您确定^是Windows的转义字符吗?你不应该使用\吗?

答案 4 :(得分:0)

回答我自己的问题:

在将参数作为列表传递时引用实际命令不能正常工作(命令是列表的第一项)所以为了解决问题,我将列表转换为空格分隔的字符串,并将其传递到子进程中。

更好的解决方案仍然受到欢迎。

答案 5 :(得分:0)

我尝试以下情况:

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)

这确实有效。