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

20 浏览
0 Comments

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

我正在寻找一种方法,可以将包含双引号的参数传递给Python的subprocess模块,而不会转义双引号。\n我看到过一些类似的问题,当双引号包围参数时,答案通常是删除引号。但我遇到的问题是,引号是参数的一部分,必须将其传递给脚本,而不是在每个引号前加上反斜杠。\n例如:\n我调用subprocesTest.bat,一个简单的批处理脚本,它接受一个参数并将其回显:\n

echo "%~1"

\n我用一个包含引号的参数从Python中调用批处理脚本:\n

import subprocess
test_string = 'Bill said "Hi!"'
cmd = ["subprocesTest.bat",
       test_string
       ]
p = subprocess.Popen(cmd)
p.wait()

\n期望输出:\n

\n\"Bill said \"Hi!\"\"\n

\n实际输出:\n

\n\"Bill said \\\"Hi!\\\"\"\n

\n当我从命令行调用相同的批处理脚本时,我可以得到期望的输出:\n

\nsubprocesTest.bat \"Bill said \"Hi!\"\"\n

\n查看源代码,subprocess.py的list2cmdline函数的文档中写着:\n

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

\n然而,如果我逐步查看这个函数,我会发现没有办法在不在每个引号前加上反斜杠的情况下传递一个双引号:\n

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

\n所以我有两个问题...\n

    \n

  • 是否可以在不在参数中加上反斜杠的情况下将参数传递给subprocess中的双引号?
  • \n

  • 如果不可能的话,有人可以解释一下为什么设计这个函数的方式吗?函数的文档字符串中的第三条似乎表明我可以通过在引号前加上反斜杠来传递一个字面的引号,但这并没有产生我期望的行为。我是否理解错了文档?
  • \n

\n以下是其他讨论此问题的线程,通过不使用引号来解决:\n

\n我没有找到关于实际上想在参数中传递引号的情况的解答。

0
0 Comments

问题的原因是,在使用Python的subprocess模块时,传递包含双引号的参数会导致一些问题。在Windows系统和/或使用.bat文件时尤其如此。在第一个示例中,运行Windows系统上类似于以下代码的程序时,会出现问题。这个问题的解决方法是在参数中添加转义字符(反斜杠)来解决双引号的问题。

解决方法如下所示:

1) 为了解决这个问题,可以在参数中添加转义字符(反斜杠)来处理双引号。修改代码如下:

import subprocess
test_string = 'Bill said \\"Hi!\\"'  # 在双引号前添加反斜杠
cmd = ["./myprog.py",
       test_string
       ]
p = subprocess.Popen(cmd)
p.wait()

2) 如果想要传递包含双引号的参数,并且希望保留原始字符串的双引号,可以使用单引号来定义字符串。修改代码如下:

import subprocess
test_string = "Bill said 'Hi!'"  # 使用单引号来定义字符串
cmd = ["./myprog.py",
       test_string
       ]
p = subprocess.Popen(cmd)
p.wait()

这样可以确保双引号在传递给subprocess时不会被解释或删除。

通过这些修改,我们可以解决在使用Python的subprocess模块时传递包含双引号的参数的问题。

0