繁体   English   中英

Python:异步检查调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM