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

时间:2013-06-05 23:34:52

标签: python subprocess quotes double-quotes quoting

我正在寻找一种方法来传递一个包含双引号的参数到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传递给包含double的子进程 引用没有预先反斜杠
  • 如果不可能,有人可以向我解释为什么这个功能 是这样设计的? funcion的doc字符串中的第3项 似乎表明我可以通过在前面添加一个字面引用 反斜杠,但这不会产生我正在寻找的行为。 我在读错了吗?

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

对于我实际上想在参数

中传递引号的情况,我看不到任何回应

1 个答案:

答案 0 :(得分:0)

1)是的,但可能不在Windows和/或.bat文件上。例如,运行等效于此的窗口时会发生什么:

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!

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

""