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 scriptlog_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