无法在python上运行转义的Windows命令行

时间:2015-09-08 01:57:08

标签: python windows python-2.7 command-line escaping

当我在Windows命令提示符下运行以下命令时,没问题。

java -jar "C:\Program Files (x86)\SnapBackup\app\snapbackup.jar" main

我尝试在python脚本中运行该命令。它失败。我的python脚本是这样的;

import os
command_line = 'java -jar "C:\Program Files (x86)\SnapBackup\app\snapbackup.jar" main'
os.system(command_line)

收到的错误消息是

  

错误:无法访问jarfile C:\ Program Files   (86)\ SnapBackuppp \ snapbackup.jar

有人可以帮忙吗?感谢。

我正在使用python 2.7.9

3 个答案:

答案 0 :(得分:3)

试试这个:

command_line = 'java -jar "C:\\Program Files (x86)\\SnapBackup\\app\\snapbackup.jar" main'

说明

Windows使用反斜杠(" \")而不是正斜杠(" /")。使用Windows命令行本身时这不是问题,但在使用处理转义序列的其他工具时会导致问题。这些转义序列都以反斜杠开头。通常,Python中的字符串会处理它们。

https://docs.python.org/2/reference/lexical_analysis.html#string-literals

如果你密切关注你的错误......

  

错误:无法访问jarfile C:\ Program Files(x86)\ SnapBackuppp \ snapbackup.jar

...您会注意到SnapBack uppp ,而不是SnapBack up \ app

发生了什么事?

" \ a"正在处理ASCII Bell(BEL)转义序列(参见上面的链接)。在他们面前带有反斜杠的其他角色没有受到影响,因为它们不对应于转义序列。 (即\P中的C:\Program Files (x86)等)

为避免将\a作为Bell字符处理,我们需要通过键入\\a来转义反斜杠本身。这样,第二个反斜杠被视为"正常"反斜杠," a"按预期阅读。

您还可以通过执行以下操作告诉Python使用原始(未处理)字符串:

command_line = r'java -jar "C:\Program Files (x86)\SnapBackup\app\snapbackup.jar" main'

(请注意第一个引号字符前的r

或者,您也可以使用正斜杠。

command_line = 'java -jar "C:/Program Files (x86)/SnapBackup/app/snapbackup.jar" main'

但是,这可能并不适用于所有情况。

答案 1 :(得分:2)

您应该使用subprocess代替os.system https://docs.python.org/2/library/subprocess.html。另外,和我之前的其他人一样,你有未转义的反斜杠。使用os.path.join来解决问题:

import subprocess, os
jarPath = os.path.join('c:', 'Program Files (x86)', 'SnapBackup', 'app', 'snapbackup.jar')
command_line = ['java', '-jar', jarPath, 'main']
subprocess.call(command_line)

答案 2 :(得分:1)

您在命令行中使用反斜杠。在python中更好地使用正斜杠或使用反斜杠转义反斜杠