【问题标题】:Python try block does not catch os.system exceptionsPython try 块不捕获 os.system 异常
【发布时间】:2012-09-04 14:39:39
【问题描述】:

我有这个 python 代码:

import os
try:
  os.system('wrongcommand')
except:
  print("command does not work")

代码打印:

wrongcommand: command not found

而不是command does not work。有谁知道它为什么不打印我的错误信息?

【问题讨论】:

    标签: python try-catch os.system except


    【解决方案1】:

    虽然 subprocess 可能是你最好的朋友。 os.system 在某些地方还是有用的,尤其是对于玩 C/C++ 模式的程序员。

    因此,代码将在下面。

    import os
    
    try:
      os_cmd = 'wrongcommand'
      if os.system(os_cmd) != 0:
          raise Exception('wrongcommand does not exist')
    except:
      print("command does not work")
    
    

    【讨论】:

      【解决方案2】:

      如果你想在命令不存在时抛出异常,你应该使用subprocess:

      import subprocess
      try:
          subprocess.run(['wrongcommand'], check = True)
      except subprocess.CalledProcessError:
          print ('wrongcommand does not exist')
      

      想想看,无论如何你应该使用subprocess 而不是os.system ...

      【讨论】:

      • 我的命令是运行 .jar 文件。当我用方括号运行正确的命令时,上面的 sn-p 仍然显示异常。当我运行没有方括号的错误命令时,上面的 sn-p 没有显示异常。如何处理?
      • 你的命令是什么样的?我怀疑你想要这样的东西:subprocess.call(["java", "-jar", "yourjar.jar"])
      • sikuli_jar = "C:\\sikulix.jar" sikuli_script = "C:\\Sikuli.sikuli" try: command = "java -jar {} -r {}".format(sikuli_jar, sikuli_script) subprocess.call([command]) except OSError: raise ("\"{}\" \"{}\" one of these is missing.".format(sikuli_jar, sikuli_script)) 上面我遇到了问题。
      • 但是用下面的代码修复了。 try: command = "java -jar {} -r {}".format(sikuli_jar, sikuli_script) subprocess.check_call(command) except (OSError, subprocess.SubprocessError, subprocess.CalledProcessError): raise ("\"{}\" \"{}\" one of these is missing.".format(sikuli_jar, sikuli_script))
      • @ShivakrishnaChippa,您能否将您的答案作为EDIT: 添加到您的问题中!它会比评论中的内容更容易阅读!
      【解决方案3】:

      还有一种更简单的方法是:

      import os
      
      def dat():
              if os.system('date') == 0:
                  print("Command successfully executed")
              else:
                  print("Command failed to execute")
      
      dat()
      

      【讨论】:

        【解决方案4】:

        因为os.system()通过方法的退出码表示失败

        • 返回值 == 0 -> 一切正常
        • 返回值!= 0 -> 一些错误

        被调用命令的退出码直接传回Python。

        有文档告诉您 os.system() 在失败的情况下会引发异常。 os.system() 只是调用操作系统底层的 system() 调用并返回它的返回值。

        请仔细阅读 os.system() 文档

        【讨论】:

          【解决方案5】:

          wrongcommand: command not foundos.system 用来调用命令的 shell 的输出。 os.system 没有抛出异常

          编辑:通过复制粘贴 mgilson 评论的一部分进行编辑

          【讨论】:

          • 谢谢,但是你如何在 python 中捕获它?有可能吗?
          • 是,但不使用os.system()。这是您应该使用@mgilson 的答案中所述的subprocess 模块的原因之一。
          • 更具体地说,wrongcommand: command not foundos.system 用来调用命令的 shell 的输出。 (具有不同 PATH 的不同 shell 可能会找到该命令)。
          【解决方案6】:

          你的代码sn-p有两个问题。首先,永远不要只做try: ... except:,始终具体说明您要处理哪个异常。否则,您的程序只会吞下任何类型的错误,包括那些您不期望的错误。在大多数情况下,这会在运行时的某个其他时间点导致意外行为。

          此外,os.system() 调用大部分时间都应该被来自subprocess 模块的对应调用替换。

          要查看出现了什么问题,请忽略 try/except 块并实际查看回溯/异常。正如其他人指出的那样,您会注意到您的情况没有例外,这就是不打印自定义字符串的原因。

          底线:考虑在您的代码块中可能发生哪些特定异常。仔细考虑由于某些原因您希望发生哪些情况,并适当地处理这些情况。不要处理那些你意想不到的事情。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-26
            • 1970-01-01
            • 1970-01-01
            • 2015-06-21
            • 2011-05-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多