7

我正在寻找一种将包含双引号的参数传递给python的子进程模块的方法,而不会转义双引号。

当引号围绕 arg 时,我已经看到这个问题被问了几次,但答案通常是删除引号。我遇到的问题是引号是参数的一部分,必须传递给脚本,而不是在每个引号前面加上反斜杠

例子:

我正在调用 subprocesTest.bat,这是一个简单的批处理脚本,它接受一个参数并回显它:

echo "%~1"

我使用包含引号的 arg 从 python 调用批处理脚本:

import subprocess
test_string = 'Bill said "Hi!"'
cmd = ["subprocesTest.bat",
       test_string
       ]

p = subprocess.Popen(cmd)
p.wait()

预期输出:

“比尔说“嗨!”

实际输出:

“比尔说“嗨!”

从命令行调用相同的批处理脚本时,我可以获得预期的输出,如下所示:

subprocesTest.bat "比尔说“嗨!”"

查看源代码,subprocess.py 的 list2cmdline 函数记录如下:

 3) A double quotation mark preceded by a backslash is
   interpreted as a literal double quotation mark.

但是,如果我单步执行此函数,我看不到在不添加反斜杠的情况下传递双引号的方法:

        elif c == '"':
            # Double backslashes.
            result.append('\\' * len(bs_buf)*2)
            bs_buf = []
            result.append('\\"')

所以我有两个问题...

  • 是否可以将 arg 传递给包含双引号但不加反斜杠的子进程
  • 如果不可能,有人可以向我解释为什么该功能是这样设计的吗?函数文档字符串中的第 3 项似乎表明我可以通过在反斜杠前面添加文字引号,但这不会产生我正在寻找的行为。我读错了文档吗?

以下是提出此问题的其他线程,并且通过不使用引号来解决:

对于我实际上想在我的论点中传递引号的情况,我没有看到任何回应

4

1 回答 1

1

1) 是的,但可能不在 Windows 和/或 .bat 文件中。例如,当您运行与此等效的 windows 时会发生什么:

import subprocess

test_string = 'Bill said "Hi!"'

cmd = ["./myprog.py",
       test_string
       ]

p = subprocess.Popen(cmd)
p.wait()

myprog.py:

#!/usr/bin/env python

import sys

print '"{}"'.format(sys.argv[1])

2)好吧,以下似乎有点模棱两可:

"Bill said "Hi!""

那是引用的字符串:

"Bill said " 

后跟不带引号的字符串:

Hi!

后跟一个带引号的空白字符串:

""

?

于 2013-06-06T06:25:46.053 回答