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

如何区分python中的子进程错误?,python,subprocess,Python,Subprocess,我正在开发一个终端,它可以像其他终端一样调用其他程序。我正在Windows上为它使用子进程。 我遇到了两个问题 第一名: 目前,我正在对使用subprocess.Popen时引发的所有错误使用OSError 代码如下: 试试看: subprocess.Popen([命令]) 除操作错误外: 打印(“'”+命令[0]+“'未被识别为命令、程序或bterm文件。”) 当我键入python时,它会正确地打开命令行python。 当我键入asdfa时,它返回错误。 问题是,当我键入python不存在文

我正在开发一个终端,它可以像其他终端一样调用其他程序。我正在Windows上为它使用子进程。 我遇到了两个问题

第一名: 目前,我正在对使用subprocess.Popen时引发的所有错误使用OSError

代码如下:

试试看:
subprocess.Popen([命令])
除操作错误外:
打印(“'”+命令[0]+“'未被识别为命令、程序或bterm文件。”)
当我键入
python
时,它会正确地打开命令行python。 当我键入
asdfa
时,它返回错误。 问题是,当我键入
python不存在文件.py
时,当子参数是问题所在时,我会得到相同的错误

我希望终端返回
(null):无法打开文件“test”:[Errno 2]没有像从cmd或bash调用时那样的文件或目录

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

Second:每当我将多字参数传递到
subprocess.Popen
subprocess.call
时,我都会自动获得该错误,而使用
os.system()时不会得到该错误。

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


我做错了什么?

子流程调用中的异常:

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

引发的最常见异常是OSError。 例如,当试图执行一个不存在的文件时,就会发生这种情况。应用程序应为操作错误异常做好准备

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

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

更多信息,请访问:

此外,您还可以在以下位置找到例外继承权:


子流程调用中的异常:

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

引发的最常见异常是OSError。 例如,当试图执行一个不存在的文件时,就会发生这种情况。应用程序应为操作错误异常做好准备

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

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

更多信息,请访问:

此外,您还可以在以下位置找到例外继承权:


您可以首先在
shutil.which
的帮助下测试可执行文件是否存在

if shutil.which(命令[0]):
尝试:
subprocess.Popen([命令])
除OSError as err外:
打印(错误)
其他:
打印(“{}”未被识别为命令、程序或bterm文件。“.format(命令[0])
然而,文档中有大量信息:这可能会有所帮助


编辑:显示了如何捕获输出,多亏了

,您可以在
shutil的帮助下首先测试可执行文件是否存在

if shutil.which(命令[0]):
尝试:
subprocess.Popen([命令])
除OSError as err外:
打印(错误)
其他:
打印(“{}”未被识别为命令、程序或bterm文件。“.format(命令[0])
然而,文档中有大量信息:这可能会有所帮助


编辑:显示了如何捕获输出,这多亏了

可能的重复?@AkhilBatra不完全是这样,我仍然希望在文件不存在时打印自定义错误,而不仅仅是从CMD返回错误。您可以尝试将子流程输出重定向到stderr,并根据返回代码捕获错误。类似于此-@AkhilBatra我得到错误使用
返回错误时,r代码2两次,但OSError as ex print(ex)除外
这太糟糕了。可能是重复的吗?@AkhilBatra不太好,我仍然希望在文件不存在时打印我的自定义错误,而不仅仅是从cmdr返回错误。您可以尝试将子流程输出重定向到stderr,并根据返回代码捕获错误。类似于此-@AkhilBatra,我在执行retu时都会收到错误代码2使用
except-OSError-as-ex-print(ex)
处理错误很糟糕。您可以使用此
python-except-OSError-as-ex:
python-print(ex)捕获输出
问题是,在这个例子中,输入到诸如cmd或python之类的东西的所有内容都被视为输入到my Terminal。您可以使用这个
python捕获输出,除了OSError作为ex:
python print(ex)
问题是,在这个例子中,输入到诸如cmd或python之类的东西的所有内容都被视为输入到我的终端
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)