我正在寻找一种方法来将包含双引号的参数传递给 python 的子进程模块,而不需要转义双引号。
当参数周围有引号时,我见过这个问题被问过几次,但答案通常是删除引号。我遇到的问题是引号是参数的一部分,必须传递给脚本,而不能在每个引号前添加反斜杠
example:
我正在调用 subprocesTest.bat,这是一个简单的批处理脚本,它接受一个参数并回显它:
echo "%~1"
我使用包含引号的参数从 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 传递给包含 double 的子进程
引用时不加反斜杠
- 如果不可能,有人可以向我解释为什么该功能
是这样设计的吗?函数文档字符串中的第三项
似乎表明我可以通过在前面添加一个字面引用来传递
反斜杠,但这并没有产生我正在寻找的行为。
我读的文档错了吗?
以下是提出此问题的其他线程,并通过不使用引号来解决:
- 使用 subprocess 模块将双引号传递给 Python 中的命令
- 我如何告诉子流程停止转义我的报价?
对于我实际上想在论证中传递引号的情况,我没有看到任何回应