我用'click'库编写了一个python cli。我还想使用 python 的内置logging模块来登录到控制台。但是我一直在努力将日志消息发送到控制台。我尝试了一个非常简单的方法:
logger = logging.getLogger(__name__)
@click.command()
def cli():
logger.setLevel("INFO")
logger.info("Does this work?")
print("done.")
Run Code Online (Sandbox Code Playgroud)
记录器内容没有出现在我的控制台中。也许它需要一个处理程序来显式地将日志消息发送到标准输出?
logger = logging.getLogger(__name__)
@click.command()
def cli():
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
handler.setLevel("INFO")
logger.addHandler(handler)
logger.info("Does this work?")
print("done.")
Run Code Online (Sandbox Code Playgroud)
不幸的是,这也不起作用。
第三个选项——创建处理程序并为处理程序和记录器设置日志级别——有效:
logger = logging.getLogger(__name__)
@click.command()
def cli():
logger.setLevel("INFO")
handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
handler.setLevel("INFO")
logger.addHandler(handler)
logger.info("Does this work?")
print("done.")
Run Code Online (Sandbox Code Playgroud)
这好像是:
logging.getLogger,我必须明确地为我的记录器创建一个处理程序。那正确吗?两次设置级别似乎很愚蠢。重点是什么?
还是我仍然误解了正确的方法?
谢谢你的帮助!
我正在尝试编写一个端点,它只接受图像并尝试通过在系统上运行命令将其转换为另一种格式。然后我返回转换后的文件。它很慢而且非常简单,而且我不需要将文件存储在任何地方,除了临时存储之外。
我希望所有文件写入都发生在临时目录中,以便将其清理干净。
如果输出文件不在临时目录中,则该路由可以正常工作。但是,如果我尝试将输出文件放入临时目录中,FileResponse 将无法找到它,并且请求会失败。
RuntimeError: File at path /tmp/tmpp5x_p4n9/out.jpg does not exist.
是否存在与 FastApi 的异步性质相关的问题,即 FileResponse 无法等待子进程创建其制作的文件?我可以让它等一下吗?(async从路线中删除没有帮助)。
@app.post("/heic")
async def heic(img: UploadFile):
with TemporaryDirectory() as dir:
inname = os.path.join(dir, "img.heic")
f = open(inname,"wb")
f.write(img.file.read())
f.flush()
# setting outname in the temp dir fails!
# outname = os.path.join(dir, 'out.jpg')
outname = os.path.join('out.jpg')
cmd = f"oiiotool {f.name} -o {outname}"
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
process.wait()
return FileResponse(outname, headers={'Content-Disposition':'attachment; filename=response.csv'})
Run Code Online (Sandbox Code Playgroud)
感谢您的任何见解!