4

我有一个命令行程序,我在 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 会尝试转义反斜杠和双引号。

我应该使用 subprocess 模块以外的东西来完成此任务,还是 Python 中的所有这些类型的模块都遵循相同的转义字符规则?我可以做些什么来告诉 subprocess 去除转义字符或根本不添加它们?

编辑

这就是我从 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

4

2 回答 2

0

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

我将把这称为我的答案,但我仍然认为能够通过子进程传递引号是一个值得解决的问题。如果有人有一个可以真正解决最初问题的答案,请发布它,我会标记它。

于 2013-04-26T14:29:15.187 回答
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)
于 2013-04-25T22:14:31.157 回答