pyinstaller 打包uvicorn的坑
0.1 你使用fastapi搭建服务,并使用uvicorn来启动。
0.2 你使用pyinstaller打包成exe文件,并且需要隐藏控制台窗口。
0.3 执行exe文件时,程序报错了(模块相关错误和日志相关错误),网上找的资料都无法解决你的问题。
如果满足这些条件,可以继续往下看,我的方法主要参考chatGpt。
例如有一个server.py文件:
1 原因分析
当你添加"-w"选项(即生成没有控制台窗口的可执行文件)时,uvicorn无法将日志和错误信息显示在控制台窗口中,因此会导致程序报错。
“Error loading ASGI app. Could not import module "server".”报错的主要原因是导入app时,没有找到"server.py"文件。
2 解决方案
禁用uvicorn将日志记录到控制台,可以使用uvicorn的日志配置选项来定制日志输出。
使用Python的logging模块来配置日志记录。可以创建一个自定义的日志配置,并将其传递给uvicorn的run
函数。
即把server.py修改成:
import os
import sys
root_path = os.getcwd()
sys.path.append(root_path)
from fastapi import FastAPI
import os,sys,uvicorn
app = FastAPI()
@app.get("/")
async def get():
return "Hello! World!"
if __name__ == "__main__":
name_app = os.path.basename(__file__)[0:-3] # Get the name of the script
log_config = {
"version": 1,
"disable_existing_loggers": True,
"handlers": {
"file_handler": {
"class": "logging.FileHandler",
"filename": "logfile.log",
},
},
"root": {
"handlers": ["file_handler"],
"level": "INFO",
},
}
uvicorn.run(f'{name_app}:app', host="0.0.0.0", port=8000, reload=False,log_config=log_config)
pyinstaller -F server.py -i lingge.jpg