python - 如何区分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
,因为我不能用它引发自定义错误。
我究竟做错了什么?
解决方案
子进程调用中的异常:
在新程序开始执行之前,子进程中引发的异常将在父进程中重新引发。此外,异常对象将有一个名为 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)
推荐阅读
- pine-script - 变量在不应该更新时更新
- excel - Excel VBA:如果满足条件,如何使用每行的单元格值填充组合框
- tensorflow - tensorflow/core/framework/cpu_allocator_impl.cc:80] 15414067200 的分配超过了 google colab 上可用系统内存的 10%
- python - 如何在自定义链表的内部类中调用外部类中的方法?
- xero-api - [Xero][Quote] 无法存储报价行项目的跟踪类别选项
- ios - 如何在自定义 iOS/MacOS 应用程序中保留通过 Xcode 生成的 Swift 文档的字体/颜色?
- java - 一种在java中获取2个循环单链表并集的方法
- python - 有没有办法在安装时自动将依赖项添加到 requirements.txt 中?
- c - 使用 Openssl EVP 加密时出现分段错误:EVP_EncryptUpdate()
- python - AssertionError:视图函数映射在为 FLASK 项目创建数据库时覆盖现有端点函数