[英]Passing double quotation marks to a command from Python using the subprocess module
我有一個命令行程序,我在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
試試這個腳本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)
我的解決方案最終成了一種警察。 盡管StampVer的文檔在所有示例中都顯示了上述版本號的格式,但事實證明你可以將引號全部放在一起,甚至將它從-f開關中分離出來,它仍然會被接受。
我將把這稱為我的答案,但我仍然認為能夠通過子進程傳遞引號是一個值得研究的問題。 如果有人的答案實際上會解決最初的問題,那么請發布它,我會標記它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.