我查过了 PyInstaller and FastAPI (maximum recursion depth exceeded)和 Pyinstaller-compiled Uvicorn server does not start correctly
FastAPI演示main.py
:
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"hello": "world"}
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=58000, reload=False)
首先运行pyinstaller pyinstaller -F main.py --clean
并在规范中添加hidden_imports
:
hidden_imports=[
'uvicorn.logging',
'uvicorn.loops',
'uvicorn.loops.auto',
'uvicorn.protocols',
'uvicorn.protocols.http',
'uvicorn.protocols.http.auto',
'uvicorn.protocols.websockets',
'uvicorn.protocols.websockets.auto',
'uvicorn.lifespan',
'uvicorn.lifespan.on',
]
它工作正常,但当workers大于1时,应用程序必须为字符串:
WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.
因此,我改为:
if __name__ == '__main__':
uvicorn.run("main:app", host="0.0.0.0", port=58000, reload=False, workers=2)
完成后,我运行了应用程序dist/main
,它创建了许多应用程序,如下图所示,使用100%的CPU和100%的内存快速运行:
适用于Python 3.8.3和pyinstaller 4.0
在我看来,这就像一个无限递归。我怀疑原因与
main:app
的自引用和一些将__name__
设置为__main__
的PyInstallersys
暗魔法有关我建议将
app
移动到一个单独的模块中,并在uvicorn.run()
中从该模块引用它:另外,不要忘记添加
app.py
作为PyInstaller的隐藏导入:在开始时调用(在Windows上)
mutiprocessing.freeze_support()
很重要,请参见官方docs此外,可能需要添加模块
main
作为隐藏导入相关问题 更多 >
编程相关推荐