d2py.tasks.utils 源代码
"""任务型事务辅助函数"""
import asyncio
import logging
import textwrap
[文档]
async def communicate_cmd(cmd: str, cwd: str|None=None, indent: int=2, **kwds)->str:
"""运行命令行执行任务
Args:
cmd: 命令行任务
cwd: 当前工作目录
indent: 命令行打印信息缩进位数
Return:
返回命令任务执行的打印信息
"""
_ = lambda text: textwrap.indent(text, prefix=" "*indent) # 美化打印信息
proc = await asyncio.create_subprocess_shell(
cmd,
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
cwd=cwd, **kwds)
stdout, stderr = await proc.communicate(input=None)
std_data = f'[{cmd!r} 退出状态码 {proc.returncode}]\n'
if stdout:
std_data += f'[stdout]:\n{_(stdout.decode())}\n'
if stderr:
std_data += f'[stdinfo]:\n{_(stderr.decode())}\n'
return std_data
# async def log_cmd(cmd: str, cwd: str|None=None, indent: int=2, logger_name="run", **kwds)->str:
# """运行命令行执行任务,并记录打印信息
# Args:
# cmd: 命令行任务
# cwd: 当前工作目录
# indent: 命令行打印信息缩进位数
# Return:
# 返回命令任务执行的打印信息
# """
# logger = logger = logging.getLogger(logger_name)
# hd = logging.StreamHandler()
# hd.setFormatter(logging.Formatter("%(message)s"))
# logger.addHandler(hd)
# proc = await asyncio.create_subprocess_shell(
# cmd,
# stdin=asyncio.subprocess.PIPE,
# stdout=asyncio.subprocess.PIPE,
# stderr=asyncio.subprocess.PIPE,
# cwd=cwd, **kwds)
# # 获取实时输出/错误信息
# if not proc.stdout.at_eof():
# for line in iter(proc.stdout.readline, b''):
# line = await line
# logger.info(line.decode())
# if proc.stdout.at_eof():
# break
# if not proc.stderr.at_eof():
# for line in iter(proc.stderr.readline, b''):
# line = await line
# logger.info(line.decode())
# if proc.stderr.at_eof():
# break
# # 等待命令执行完成
# proc.wait()