小编Bet*_*fEd的帖子

使用Python将包含双引号的参数传递给子流程

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

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

例:

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

echo "%~1"
Run Code Online (Sandbox Code Playgroud)

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

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

p = subprocess.Popen(cmd)
p.wait()
Run Code Online (Sandbox Code Playgroud)

预期输出:

“比尔说:“嗨!”

实际输出:

“比尔说\“嗨!\”

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

subprocesTest.bat“比尔说”嗨!“

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

 3) A double quotation mark preceded by a backslash is
   interpreted as a literal double quotation mark.
Run Code Online (Sandbox Code Playgroud)

但是,如果我逐步执行此功能,则看不到不加反斜杠就不能传递双引号的方法:

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

所以我有两个问题...

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

这是询问此问题的其他线程,并且通过不使用引号来解决:

我实际上想在引数中使用引号的情况下,我看不到任何回应

python quotes subprocess quoting double-quotes

5
推荐指数
1
解决办法
7249
查看次数

标签 统计

double-quotes ×1

python ×1

quotes ×1

quoting ×1

subprocess ×1