在`asyncio`模块中是否存在类似于`CalledProcessError`的模拟?

时间:2018-06-05 17:34:35

标签: python asynchronous exception subprocess python-asyncio

asyncio模块中是否存在来自subprocess模块的CalledProcessError例外的模拟?

我原本希望有一个模拟,因为asyncio模块会创建TimeoutError异常来替换subprocess模块中的TimeoutExpired异常。但似乎没有一个。

作为一个子问题:CalledProcessError例外是否仅适用于Popen类的实例?或者它是否也适用于实现(子)处理功能的其他类(例如来自asyncio的{​​{3}}或来自tornado.process的{​​{3}})?

似乎情况是CalledProcessError异常可能与类似但与Popen不同的类的实例一起使用。例如,可以在GitHub Process上找到使用CalledProcessError Subprocess类的实例调用tornado.process的人。

请注意,在上面的示例中,虽然tornado.process确实具有subprocess.CalledProcessError的别名,但基于import语句>不被调用的异常;它真的被subprocess.CalledProcessError召唤。

如果CalledProcessError也适用于来自Process的{​​{1}}类的实例,那么为什么asyncio也不能使用TimeoutExpired的实例来自Process的课程?换句话说,在asyncio中,为什么有必要创建asyncio例外的新版本(TimeoutError),但创建新版本需要 not TimeoutExpired例外?

在一天结束时Subprocess并不复杂,所以如果我想从CalledProcessErrorProcess类的实例创建重复版本,我想我可能会,但似乎首先尝试避免这种代码重复。

注意:我当前工作的心理模型是" asyncio模块旨在执行asyncio.subprocess模块所做的所有事情,但是异步地#34;。如果这种心理模型不正确,这个问题可能会包含固有的先入之见/错误观念。

2 个答案:

答案 0 :(得分:2)

asyncio不包含CalledProcessError的任何等效项,因为它不包含引发CalledProcessError的内容的任何等效项。对于check_callcheck_outputcheck_returncodecheckrun参数没有等价物。

答案 1 :(得分:0)

没有这样的例外,没有。 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