复现过程:
FastAPI demo main.py
:
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"hello": "world"}
if __name__ == '__main__':
uvicorn.run("main:app", host="0.0.0.0", port=58000, reload=False, workers=2)
此时使用 python main.py
运行无问题。
但使用 pyinstaller -F main.py --clean
打包,修改下 spec 中的 hidden_import
后 运行 pyinstaller main.spec
:
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',
]
尝试运行 exe,当 workers 为 1 的时候没有问题,当 workers 为 2 的时候,会一直创建 app 直到内存爆炸:
猜测是可能一直重复引用本身出现的问题,但是如果分开 app 和 uvicorn 打包,字符串 "main:app" 引用 app 的方式就无法运行。如果再不行的话,只能考虑多次执行打包后的文件了。
请大佬们解惑。
运行环境:
1
wynemo 2020-12-27 16:44:11 +08:00
如果没有特殊需求 建议还是有 python 运行时或者 docker 一把梭。
此问题是的 uvicorn.subprocess.spawn 要加上 freeze_support 参考 https://github.com/pyinstaller/pyinstaller/blob/c595c21ed76fcc3fa43440b33f17c8b332b32ad4/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py |