【问题标题】:Python subprocess issue with ampersandsPython子进程问题与&符号
【发布时间】:2010-09-12 08:22:39
【问题描述】:

我目前遇到了一个 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' 的第一个元素包含任何 & 符号时。引用第一个字符串不起作用。

【问题讨论】:

  • “脚本”到底是什么意思?什么适用于窗户?什么在其他操作系统上失败了?还有什么操作系统?

标签: python windows subprocess command-line-arguments


【解决方案1】:

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

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

【讨论】:

  • @workmad3:出于好奇,这个答案的哪一部分有帮助?您已经在上面给出了Popen 的语法!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    尝试引用包含 & 的参数

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

    通常是必须在 Linux shell 中完成的操作

    【讨论】:

      【解决方案4】:

      "用 ^ 转义 &"

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

      【讨论】:

      • 是的 ^ 是一个 Windows 转义字符。 \ 是目录分隔符。
      • (澄清,^是windows命令解释器的转义字符)
      • suborocess.Popen( ) 的参数是 Python 字符串。您确定“&”没有在其他地方处理并变成意外的东西。 prog 变量的实际值是多少?
      【解决方案5】:

      回答我自己的问题:

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

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

      【讨论】:

      • 如果您可以向我们提供一些实际信息,了解您在做什么以及它是如何失败的,我们或许可以为您提供解决方案。向我们展示你在做什么。向我们展示代码和失败。这是它的工作原理: >>> subprocess.call([r"c:\spam&ham\python.exe", "-c", ""]) 0 >>>
      • 您还需要多少实际信息?我已经说过错误是什么,为什么会发生,现在我已经更新了失败的行,因为它会提供所有帮助。我无法提供更多信息。
      • 向我们展示所涉及的 actual 路径名的示例,您遇到的 actual 错误(包括回溯),以及您如何在 shell 中“解决”它- 调用你在这里给出的替代方案。
      • 我已经说过路径名(包含 & 符号的任何内容都不够?)错误现在已经到位,解决方案是将列表折叠成字符串。由于不确定我的公司 NDA 涵盖的内容,我无法提供实际路径名。
      • 然后做一个最小的非工作示例。我已经测试了您在路径中使用 & 符号的操作,并且 它可以工作(参见上面的简短示例),所以还有其他问题。在看到实际代码之前,我们无法弄清楚是什么。
      【解决方案6】:

      我尝试如下情况:

      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)
      

      这确实有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多