Python PyInstaller和FastAPI(超过最大递归深度)
我有一个python服务,它使用fastapi作为web界面。我需要制作一个可执行文件,因此我使用的是PyInstaller 我不断得到以下错误:Python PyInstaller和FastAPI(超过最大递归深度),python,pyinstaller,fastapi,Python,Pyinstaller,Fastapi,我有一个python服务,它使用fastapi作为web界面。我需要制作一个可执行文件,因此我使用的是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 ".
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
我添加了导入系统;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)
我今天也遇到了同样的问题,我发现问题出在模块中 我直接从存储库中重新安装了它:
pip卸载pydantic
pip安装git+git://github.com/samuelcolvin/pydantic@主人#蛋=皮丹蒂克
#或者用额外的
pip安装git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic[电子邮件,键入扩展名]
这将解决最大递归深度问题,但在以下方面会遇到另一个问题:
回溯(最近一次呼叫最后一次):
文件“logging/config.py”,第388行,解析
AttributeError:模块“uvicorn”没有属性“logging”
我用+替换了它,现在效果很好
这是我的最终代码:
从fastapi导入fastapi
app=FastAPI()
@app.get(“/”)
def read_root():
返回{“你好”:“世界”}
如果名称=“\uuuuu main\uuuuuuuu”:
导入异步
导入uvloop
从hypercorn.asyncio导入服务
从hypercorn.config导入配置
config=config()
config.bind=[“0.0.0.0:8000”]
asyncio.set\u event\u loop\u策略(uvloop.EventLoopPolicy())
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
循环。运行_直到_完成(服务(应用程序,配置))
使用@UFO answer I,然后还更新了PyInstaller以包含隐藏的模块
pyinstaller 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)
pyinstaller
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)
您是否尝试进一步提高递归限制?如果指定
100.000
或更多,会发生什么情况?这是一个众所周知的问题。我们正在修复。谢谢你,效果很好。如果要继续使用Uvicorn,此处的答案将解决此问题:
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)