如何在python中区分子进程错误?

时间:2019-05-18 21:06:51

标签: python subprocess

我正在一个可以像其他终端一样调用其他程序的终端上工作。我正在Windows上使用子进程。 我遇到了两个问题。

第一: 目前,我正在使用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调用它一样。

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

第二::每当我将多字参数传递到subprocess.Popensubprocess.call时,我都会自动遇到该错误,而我不会使用{{1 }}

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

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

子流程调用中的异常:

在新程序开始执行之前,子进程中引发的异常将在父进程中重新引发。 此外,该异常对象还有一个名为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)

答案 1 :(得分:1)

您可以首先借助shutil.which测试可执行文件的存在。

if shutil.which(commands[0]):
    try:
        subprocess.Popen([commands])
    except OSError as err:
        print(err)
else:
    print("'{}' is not recognised as a command, program or bterm file.".format(commands[0])

文档中提供了大量信息:https://docs.python.org/dev/library/subprocess.html可能会有所帮助。

编辑:感谢Auxilor

,展示了如何捕获输出