我有一个命令行程序,我在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
答案 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开关中分离出来,它仍然会被接受。
我打算将此称为我的答案,但我仍然认为能够通过子流程传递引号是一个值得研究的问题。如果有人的答案实际上会解决最初的问题,那么请发布它,然后我会标记它。