【问题标题】:How to pass a backslash as an argument via Python subprocess module?如何通过 Python 子进程模块将反斜杠作为参数传递?
【发布时间】:2016-02-03 00:40:11
【问题描述】:

我想使用 Python 的子进程来调用命令行程序,该程序需要将路径作为参数传入。因为这是在 Windows 上,所以路径包含反斜杠。我尝试了许多选项,其中一些选项设置为打印出从子进程接收到的路径参数:

转义的反斜杠:

>>> cmd = ['f:\\code\\Util.exe', '-i', 'c:\\Users\\paul\\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul\\data.xml\n', '...')

单反斜杠,原始格式:

>>> cmd = ['f:\\code\\Util.exe', '-i', r'c:\Users\paul\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul\\data.xml\n', '...')

单反斜杠:

>>> cmd = ['f:\\code\\Util.exe', '-i', 'c:\Users\paul\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul?5data.xml', '...')

在任何情况下,反斜杠都会作为双反斜杠传递给 Windows 程序。有没有办法将单个反斜杠传递给被调用的程序?

【问题讨论】:

  • 使用带有r'thisisyourstring' r前缀的raw str
  • @R Nar:呃,这不是我在上面第二个例子中所做的吗?
  • 对不起,我没看到!
  • 输出是给你单斜杠。但是输出被转义为 Python 字符串文字。这里没有问题。
  • @Busturdust:我同意它更干净,但它仍然不起作用:)

标签: python subprocess command-line-arguments


【解决方案1】:

您对输出感到困惑。 Popen.communicate() 给你一个 tuple,包含 stdout 和 stderr 流。因为您获得了一个元组,所以该元组的内容通过 repr() 函数显示。您的 字符串值 不包含双反斜杠,但由于此类反斜杠在 Python 字符串文字中具有特殊含义,因此它们以 Python 文字形式显示为双引号:

>>> value = r'foo\bar'
>>> value
'foo\\bar'
>>> print value
foo\bar
>>> print (value,)  # tuple
('foo\\bar',)
>>> print (value,)[0]  # back to one string
foo\bar

换句话说:这里没有问题,你得到了 single 个反斜杠,但是 Python 为你提供了文字符号表示(为了便于调试)。

【讨论】:

    【解决方案2】:

    第一种形式,将它们加倍,是应该工作的形式。但是请注意,当 Python 在引号中显示字符串时,它会 add 转义。例如,如果您输入'\\',解释器会显示完全相同的内容。但实际上它是一个反斜杠。你可以通过len('\\')print '\\' 看到这一点。

    所以我的问题是,您是否确定反斜杠是双倍的,还是 Python 只是在显示它们时转义它们?

    【讨论】:

    • 我没有从 Python 中显示它们。我从 C# Util.exe 代码中对它们进行 Console.Writeline() 处理。所以,是的,Python 将它们作为文字双反斜杠传递给另一个程序。
    • 嗯,问题出在您传递给Popen 的字符串中不是。在某个地方,某些东西决定它需要转义这些字符。
    【解决方案3】:

    更好的方法是使用shlex 来拆分字符串并在命令中使用列表。

    您可以在下面找到一个示例 here

    >>> import shlex, subprocess
    >>> command_line = input()
    /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
    >>> args = shlex.split(command_line)
    >>> print(args)
    ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
    >>> p = subprocess.Popen(args) # Success!
    

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2019-07-19
      • 2013-09-11
      相关资源
      最近更新 更多