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
并不复杂,所以如果我想从CalledProcessError
为Process
类的实例创建重复版本,我想我可能会,但似乎首先尝试避免这种代码重复。
注意:我当前工作的心理模型是" asyncio
模块旨在执行asyncio.subprocess
模块所做的所有事情,但是异步地#34;。如果这种心理模型不正确,这个问题可能会包含固有的先入之见/错误观念。
答案 0 :(得分:2)
asyncio
不包含CalledProcessError
的任何等效项,因为它不包含引发CalledProcessError
的内容的任何等效项。对于check_call
,check_output
,check_returncode
,check
或run
参数没有等价物。
答案 1 :(得分:0)
没有这样的例外,没有。 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
。