36

我有这个python代码:

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

代码打印:

wrongcommand: command not found

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

4

6 回答 6

53

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

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

想一想,您可能应该使用subprocess而不是os.system无论如何...

于 2012-09-11T15:56:44.310 回答
34

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

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

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

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

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

于 2012-09-11T15:54:59.360 回答
13

虽然 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")

于 2019-06-24T07:56:01.703 回答
5

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

此外,os.system()大多数时候调用应该被subprocess模块中的对应调用替换。

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

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

于 2012-09-11T15:54:27.253 回答
1

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

编辑:由 mgilson 评论的复制和粘贴部分编辑

于 2012-09-11T15:54:09.957 回答
1

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

import os

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

dat()
于 2019-12-24T10:17:16.810 回答