使用子进程模块将双引号传递给Python的命令

时间:2013-04-25 21:15:19

标签: python string escaping subprocess double-quotes

我有一个命令行程序,我在Python脚本中使用它来处理将构建号标记到可执行文件上。

这是命令行程序:http://www.elphin.com/downloads/stampver/

我的问题是程序在其中一个参数中使用双引号(“),并且我用来调用此程序的Python子进程模块在执行程序时会在反向引号前加上反斜杠。这会导致程序由于语法不正确而失败。

期待像StampVer.exe -nopad -k -f"0.1.4491.0" <ExeFile>.exe

这样的命令

而Python正在执行:StampVer.exe -nopad -k -f\"0.1.4491.0\" <ExeFile>.exe

我已经在StackOverflow上尝试了一些我发现的类似声音问题,例如将字符串标记为原始字符串或在Python中引用之前添加反斜杠;这只会导致命令行上的三个反斜杠而不是一个,因为Python会尝试转义反斜杠以及双引号。

我是否应该使用子进程模块之外的其他东西来完成此任务,或者在Python中执行所有这些类型的模块遵循相同的规则来转义字符?我能做些什么来告诉子进程去除转义字符或根本不添加它们吗?

修改

这就是我从Python调用子进程的方法:

def set_file_version(version_number, filepath):

    try:
        file_version_arg = '-f"{0}"'.format(version_number)
        cmd_line = ["StampVer.exe", "-nopad", "-k", file_version_arg, filepath]
        subprocess.check_output(cmd_line)

    except subprocess.CalledProcessError as e:
        if e.returncode == 1:
            pass
        else:
            raise e

StampVer然后返回:

error: Invalid -f parameter. Try -f"0.0.0.0" Use StampVer -? for help

2 个答案:

答案 0 :(得分:0)

试试这个脚本sub.py:

#! /usr/bin/python

import sys
from subprocess import check_output

if len(sys.argv) > 1:
    print sys.argv
else:
    print check_output((sys.argv[0], '-f"1234"'))

然后运行它:

./sub.py

它返回我们给出的内容:

['./sub.py', '-f"1234"']

所以我猜check_output工作正常,问题可能来自StampVer.exe如何处理参数,你可以试试

file_version_arg = '-f{0}'.format(version_number)

答案 1 :(得分:0)

我的解决方案最终成了一种警察。尽管StampVer的文档在所有示例中都显示了上述版本号的格式,但事实证明你可以将引号全部放在一起,甚至将它从-f开关中分离出来,它仍然会被接受。

我打算将此称为我的答案,但我仍然认为能够通过子流程传递引号是一个值得研究的问题。如果有人的答案实际上会解决最初的问题,那么请发布它,然后我会标记它。