`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
类的实例?或者它是否也适用于实现(子)进程功能的其他类(例如来自asyncio
的Process
或来自tornado.process
的Subprocess
)?
似乎CalledProcessError
异常可能适用于与Popen
相似但不同的类的实例。例如,可以在 GitHub examples 上找到使用来自 tornado.process
的 Subprocess
类的实例调用 CalledProcessError
的人。
请注意,在上面的示例中,虽然 tornado.process
确实有 subprocess.CalledProcessError
的别名,但基于文件顶部的 import
语句,不是异常被调用;真的是subprocess.CalledProcessError
被调用了。
如果CalledProcessError
也适用于来自asyncio
的Process
类的实例,那么为什么TimeoutExpired
不能也适用于来自asyncio
的Process
类的实例?换句话说,在asyncio
为什么有必要创建TimeoutExpired
异常的新版本(TimeoutError
),但不是需要创建CalledProcessError
异常的新版本?
归根结底,the source code for CalledProcessError
并没有那么复杂,所以如果我想为来自asyncio
的Process
类的实例创建一个重复版本,我想我可能可以,但似乎最好先尽量避免这样的代码重复。
注意:我目前的工作心智模型是“asyncio.subprocess
模块旨在完成 subprocess
模块所做的所有事情,但异步”。如果这种心智模型不正确,那么这个问题很可能包含固有的成见/误解。
【问题讨论】:
asyncio
不打算成为subprocess
的替代品。你的基本前提是错误的。
@user2357112:但是有是 subprocess
-like support in the asyncio
module,这就是我认为OP所指的。我认为 OP 意味着该支持应该是协同程序等待的等价物。
@MartijnPieters 是的,听起来你说的比我说的更正确。
【参考方案1】:
asyncio
不包含CalledProcessError
的任何等价物,因为它不包含引发CalledProcessError
的事物的任何等价物。 check_call
、check_output
、check_returncode
或 check
参数与 run
没有等效项。
【讨论】:
【参考方案2】:没有这样的例外,没有。 asyncio.subprocess
implementation 应被视为等同于 subprocess.Popen()
。来自asyncio.subprocess.Process
documentation:
Process
类的 API 设计为接近subprocess.Popen
类的 API[.]
CalledProcessError
异常仅由同一模块中的高级函数(例如 suprocess.run()
)引发,每个函数都在后台驱动 Popen()
。
当Process.returncode
value 不为零时,只需引发您自己的异常。如果您愿意,您可以为此重新使用CalledProcessError
,它只是一个容器,用于命令运行、返回代码以及stderr
和stdout
字符串。这些都是内置的 Python 类型,没有特定于 subprocess
的内容。
【讨论】:
如果我有足够的声誉,我会投赞成票。这个和另一个答案都非常有帮助;对于这个答案,我喜欢最后一部分澄清如何为这种情况编写一个例外。以上是关于`asyncio` 模块中是不是有 `CalledProcessError` 的类似物?的主要内容,如果未能解决你的问题,请参考以下文章