首页 > 解决方案 > 如何区分python中的子进程错误?

问题描述

我正在开发一个可以像任何其他终端一样调用其他程序的终端。我在 Windows 上使用子进程。我遇到了2个问题。

第一: 目前,我使用 OSError 来处理使用 subprocess.Popen 时引发的所有错误。

它的代码在这里:

try:
    subprocess.Popen([command])
except OSError:
    print("'" + command[0] + "' is not recognised as a command, program or bterm file.")

当我输入python时,它会正确打开命令行 python。当我输入asdfa时,它会返回错误。问题是,当我键入时python non-existent-file.py,当子参数是问题时,我得到了同样的错误。

(null): can't open file 'test': [Errno 2] No such file or directory我希望终端像从 cmd 或 bash 调用时一样返回。

如何区分这两个错误,同时在文件不存在时保留我的自定义错误消息?

第二:每当我将多字参数传递给subprocess.Popen或者subprocess.call我自动得到那个错误,我没有使用os.system()

我不想使用os.system,因为我不能用它引发自定义错误。

我究竟做错了什么?

标签: pythonsubprocess

解决方案


子进程调用中的异常:

在新程序开始执行之前,子进程中引发的异常将在父进程中重新引发。此外,异常对象将有一个名为 child_traceback 的额外属性,它是一个包含从孩子的角度来看的追溯信息的字符串。

最常见的异常是OSError。例如,在尝试执行不存在的文件时会发生这种情况。应用程序应该为 OSError 异常做好准备。

如果使用无效参数调用 Popen,将引发ValueError 。

如果被调用进程返回非零返回码, check_call () 和check_output () 将引发CalledProcessError 。

您可以在以下位置找到更多信息: https ://docs.python.org/2/library/subprocess.html#exceptions

您还可以在以下位置找到异常层次结构: https ://docs.python.org/2/library/exceptions.html#exception-hierarchy

try:
    output = subprocess.check_output("\\test.exe')
except subprocess.CalledProcessError as e:
    print("Something Fishy... returncode: " + e.returncode + ", output:\n" + e.output)
else:
    print("Working Fine:\n" + output)

推荐阅读