`asyncio` 模块中是不是有 `CalledProcessError` 的类似物?

Posted

技术标签:

【中文标题】`asyncio` 模块中是不是有 `CalledProcessError` 的类似物?【英文标题】:Is there an analog to `CalledProcessError` in the `asyncio` module?`asyncio` 模块中是否有 `CalledProcessError` 的类似物? 【发布时间】:2018-06-05 17:34:35 【问题描述】:

asyncio 模块中是否存在与subprocess 模块中的CalledProcessError 异常类似的情况?

我原以为会有一个模拟,因为asyncio 模块创建了TimeoutError 异常来替换subprocess 模块中的TimeoutExpired 异常。但是好像没有。

作为一个子问题:CalledProcessError 异常是否仅适用于 Popen 类的实例?或者它是否也适用于实现(子)进程功能的其他类(例如来自asyncioProcess 或来自tornado.processSubprocess)?

似乎CalledProcessError 异常可能适用于与Popen 相似但不同的类的实例。例如,可以在 GitHub examples 上找到使用来自 tornado.processSubprocess 类的实例调用 CalledProcessError 的人。

请注意,在上面的示例中,虽然 tornado.process 确实有 subprocess.CalledProcessError 的别名,但基于文件顶部的 import 语句,不是异常被调用;真的是subprocess.CalledProcessError被调用了。

如果CalledProcessError 也适用于来自asyncioProcess 类的实例,那么为什么TimeoutExpired 不能也适用于来自asyncioProcess 类的实例?换句话说,在asyncio 为什么有必要创建TimeoutExpired 异常的新版本(TimeoutError),但不是需要创建CalledProcessError 异常的新版本?

归根结底,the source code for CalledProcessError 并没有那么复杂,所以如果我想为来自asyncioProcess 类的实例创建一个重复版本,我想我可能可以,但似乎最好先尽量避免这样的代码重复。

注意:我目前的工作心智模型是“asyncio.subprocess 模块旨在完成 subprocess 模块所做的所有事情,但异步”。如果这种心智模型不正确,那么这个问题很可能包含固有的成见/误解。

【问题讨论】:

asyncio 不打算成为subprocess 的替代品。你的基本前提是错误的。 @user2357112:但是有 subprocess-like support in the asyncio module,这就是我认为OP所指的。我认为 OP 意味着该支持应该是协同程序等待的等价物。 @MartijnPieters 是的,听起来你说的比我说的更正确。 【参考方案1】:

asyncio 不包含CalledProcessError 的任何等价物,因为它不包含引发CalledProcessError 的事物的任何等价物。 check_callcheck_outputcheck_returncodecheck 参数与 run 没有等效项。

【讨论】:

【参考方案2】:

没有这样的例外,没有。 asyncio.subprocess implementation 应被视为等同于 subprocess.Popen()。来自asyncio.subprocess.Process documentation:

Process 类的 API 设计为接近 subprocess.Popen 类的 API[.]

CalledProcessError 异常仅由同一模块中的高级函数(例如 suprocess.run())引发,每个函数都在后台驱动 Popen()

Process.returncode value 不为零时,只需引发您自己的异常。如果您愿意,您可以为此重新使用CalledProcessError,它只是一个容器,用于命令运行、返回代码以及stderrstdout 字符串。这些都是内置的 Python 类型,没有特定于 subprocess 的内容。

【讨论】:

如果我有足够的声誉,我会投赞成票。这个和另一个答案都非常有帮助;对于这个答案,我喜欢最后一部分澄清如何为这种情况编写一个例外。

以上是关于`asyncio` 模块中是不是有 `CalledProcessError` 的类似物?的主要内容,如果未能解决你的问题,请参考以下文章

python:asyncio模块

python异步编程模块asyncio学习

Python asyncio 模块

asyncio--python3未来并发编程主流充满野心的模块

Python标准模块--asyncio

asyncio模块