鉴于此变量:
cardIP="00.00.00.00"
dir="D:\\TestingScript"
mainScriptPath='"\\\\XX\\XX\\XX\\Testing\\SNMP Tests\\Python Script\\MainScript.py"'
使用subprocess.call("cmd /c "+mainScriptPath+" "+dir+" "+cardIP)
和print(mainScriptPath+" "+dir+" "+cardIP)
时,我明白这一点:
"\\XX\XX\XX\Testing\SNMP Tests\Python Script\MainScript.py" D:\TestingScript 00.00.00.00
这就是我想要的,好的。
但是现在,我希望'dir'变量也在“”里面,因为我将使用带空格的目录名称。 所以,我对'mainScriptPath'做了同样的事情:
cardIP="00.00.00.00"
dir='"D:\\Testing Script"'
mainScriptPath='"\\XX\\XX\\XX\\Testing\\SNMP Tests\\Python Script\\MainScript.py"'
但现在,当我正在做print(mainScriptPath+" "+dir+" "+cardIP)
时,我得到了:
"\\XX\XX\XX\Testing\SNMP Tests\Python Script\MainScript.py" "D:\Testing Script" 00.00.00.00
哪个好,但在subprocess.call("cmd /c "+mainScriptPath+" "+dir+" "+cardIP)
执行时,'mainScriptPath'变量出现故障:
'\\XX\XX\XX\Testing\SNMP' is not recognized as an internal or external command...
对我来说没有意义。
为什么会失败?
另外,我也试过了:
dir="\""+"D:\\Testing Script"+"\""
在'print'中表现良好但在'subprocess.call'中引发同样的问题。
(Windows XP,Python3.3)
答案 0 :(得分:3)
使用正确的字符串格式,使用单引号作为格式字符串,只需包含引号:
subprocess.call('cmd /c "{}" "{}" "{}"'.format(mainScriptPath, dir, cardIP))
另一种方法是传入参数的列表,并让Python负责为你引用:
subprocess.call(['cmd', '/c', mainScriptPath, dir, cardIP])
当.call()
的第一个参数是列表时,Python使用Converting an argument sequence to a string on Windows部分中描述的过程。
在Windows上, args 序列将转换为可以的字符串 使用以下规则解析(对应于使用的规则) 通过MS C运行时):
- 参数由空格分隔,可以是空格或制表符。
- 由双引号括起的字符串被解释为单个参数,而不管其中包含的空格。引用 string可以嵌入到参数中。
- 以反斜杠开头的双引号被解释为文字双引号。
- 反斜杠按字面解释,除非它们紧跟在双引号之前。
- 如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为文字反斜杠。如果 反斜杠的数量是奇数,最后一个反斜杠逃脱了下一个反斜杠 如第3条所述的双引号。
醇>
这意味着将参数作为序列传递会让Python担心正确转义参数的所有细节,包括处理嵌入的反斜杠和双引号。