5

我目前有一个 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. 失败的命令是:

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

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

4

6 回答 6

6

确保您使用的是列表并且没有 shell 扩展:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)
于 2008-09-23T12:36:19.823 回答
1

一个正确的答案将需要更多的信息。你到底在做什么?它是如何失败的?你在使用 subprocess 模块吗?您是在传递参数列表和 shell=False (或没有 shell 参数),还是实际上在调用 shell?

于 2008-09-23T12:36:18.123 回答
1

尝试引用包含 &

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

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

于 2008-09-23T12:36:32.630 回答
1

“用 ^ 转义与号”

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

于 2008-09-23T13:29:31.160 回答
0

回答我自己的问题:

将参数作为列表传递时引用实际命令无法正常工作(命令是列表的第一项),因此为了解决该问题,我将列表转换为空格分隔的字符串并将其传递给子进程。

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

于 2008-09-23T12:49:55.423 回答
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)

这确实有效。

于 2014-01-04T14:36:14.610 回答