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