繁体   English   中英

Python try 块不捕获 os.system 异常

[英]Python try block does not catch os.system exceptions

我有这个python代码:

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

代码打印:

wrongcommand: command not found

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

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

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

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

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

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

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

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

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

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

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

此外,大部分时间os.system()调用应该subprocess进程模块中的对应调用替换。

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

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

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

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

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

import os

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

dat()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM