【问题标题】:Cannot run escaped Windows command line on python无法在 python 上运行转义的 Windows 命令行
【发布时间】:2015-12-03 13:39:48
【问题描述】:

当我在 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 (x86)\SnapBackuppp\snapbackup.jar

有人可以帮忙吗?谢谢。

我正在使用 python 2.7.9

【问题讨论】:

  • 您是否注意到错误消息在 SnapBackup 末尾有 3 个字母“p”?这是问题还是 python 文件中的错字?
  • python 代码没有问题。刚刚又查了。我从 pycharm IDE 复制并粘贴了错误消息。我真的不知道为什么有3 p。奇怪。
  • 反斜杠!使用正斜杠或转义反斜杠,如 \\
  • 嘿!这就是答案。谢谢!答案是command_line = 'java -jar "C:/Program Files (x86)/SnapBackup/app/snapbackup.jar" main'。请把它复制下来,作为答案发布,我会给你投票。你活该!

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


【解决方案1】:

您可能应该使用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)

【讨论】:

  • 奇怪。出现同样的错误。不过谢谢。赞成。
  • 刚刚注意到问题下的cmets。其他人的手指比我快:)。我已经更新了我的答案以提供一种跨平台的方式。使用os.path.join 就可以了,因此您不必担心适合使用哪种斜线。
【解决方案2】:

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

【讨论】:

    【解决方案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

    ...您会注意到它显示的是 SnapBackuppp,而不是 SnapBackup\app

    发生了什么?

    “\a”被处理为 ASCII Bell (BEL) 转义序列(参见上面的链接)。前面带有反斜杠的其他字符不受影响,因为它们不对应转义序列。 (即C:\Program Files (x86)中的\P等)

    为了避免将\a 处理为贝尔字符,我们需要通过键入\\a 来转义反斜杠本身。这样,第二个反斜杠被视为“普通”反斜杠,“a”按预期读取。

    你也可以告诉 Python 使用 raw(未处理的)字符串:

    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'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 2021-07-17
      • 2022-01-17
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多