[英]Python: async check_call
如何使用 asyncio 模拟“subprocess.check_call”的行为?
asyncio 似乎只提供较低级别的方法“asyncio.create_subprocess_shell”。
将create_subprocess_shell
包装成类似于check_call
的行为实际上非常简单。 从python 文档中的规范:
使用 arguments 运行命令。 等待命令完成。 如果返回码为零,则返回,否则引发 CalledProcessError。 CalledProcessError object 将在 returncode 属性中具有返回码。 如果 check_call() 无法启动进程,它将传播引发的异常。
所以我们可以写这个 function
import asyncio
from subprocess import CalledProcessError
async def check_call(cmd, **kwargs):
process = await asyncio.create_subprocess_shell(cmd, **kwargs)
return_code = await process.wait()
if return_code != 0:
raise CalledProcessError(return_code, cmd)
所以在这样的情况下
async def main():
await check_call("ls non_existing_path")
asyncio.run(main())
将打印以下内容
ls: cannot access 'non_existing_path': No such file or directory
Traceback (most recent call last):
File "73214383.py", line 13, in <module>
asyncio.run(main())
File "/usr/lib/python3.8/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
return future.result()
File "73214383.py", line 11, in main
await check_call("ls non_existing_path")
File "73214383.py", line 8, in check_call
raise CalledProcessError(return_code, cmd)
subprocess.CalledProcessError: Command 'ls non_existing_path' returned non-zero exit status 2.
这与 python 的check_call
的行为方式非常相似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.