mas*_*ask 3 python pyinstaller fastapi
我有一个使用fastapi作为 Web 界面的 python 服务。我需要制作一个可执行文件,因此我正在使用PyInstaller。
我不断收到以下错误:
File "..../miniconda3/lib/python3.7/site-packages/PyInstaller/lib/modulegraph/modulegraph.py", line 2912, in _load_package
self._load_module(fqname, fp, buf, stuff)
File "..../miniconda3/lib/python3.7/site-packages/PyInstaller/lib/modulegraph/modulegraph.py", line 2093, in _load_module
m = self._load_package(fqname, pathname, packagepath)
RecursionError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
我添加import sys; sys.setrecursionlimit(50000)到原始 python 文件以及规范中,但仍然遇到相同的问题。
有趣的是,如果我不使用fastapi(例如它与 Flask 一起使用),我就不会收到该错误。看起来 PyInstaller 对 fastapi 有一些问题。
有人知道如何解决这个问题吗?
这是我的主要 python 函数中的代码:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", workers=1, port=5000)
Run Code Online (Sandbox Code Playgroud)
小智 5
我今天也遇到了同样的问题,发现问题出在Pydantic模块上。
我直接从存储库中重新安装了它:
pip uninstall pydantic
pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic
# or with extras
pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic[email,typing_extensions]
Run Code Online (Sandbox Code Playgroud)
这将解决最大递归深度问题,但在Uvicorn 中会遇到另一个问题:
Traceback (most recent call last):
File "logging/config.py", line 388, in resolve
AttributeError: module 'uvicorn' has no attribute 'logging'
Run Code Online (Sandbox Code Playgroud)
而我换成Uvicorn与Hypercorn + Uvloop,现在工作得很好。
这是我的最终代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
import asyncio
import uvloop
from hypercorn.asyncio import serve
from hypercorn.config import Config
config = Config()
config.bind = ["0.0.0.0:8000"]
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(serve(app, config))
Run Code Online (Sandbox Code Playgroud)
使用 @UFO 答案,我还更新了 PyInstaller 以包含隐藏模块
pydantic从源卸载并安装。希望这将很快在注册表中更新。pip uninstall pydantic
pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic
# or with extras
pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic[email,typing_extensions]
Run Code Online (Sandbox Code Playgroud)
跑步pyinstaller main.py
将这些隐藏的导入添加到.spec由pyinstaller
hiddenimports=[
'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',
]
Run Code Online (Sandbox Code Playgroud)
pyinstaller main.spec参考:
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=8000)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |