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

 

 

posted @ 2024-08-09 15:07  心愿路自平  阅读(219)  评论(0编辑  收藏  举报