Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyInstaller和FastAPI(超过最大递归深度)_Python_Pyinstaller_Fastapi - Fatal编程技术网

Python PyInstaller和FastAPI(超过最大递归深度)

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 ".

我有一个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 "..../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以包含隐藏的模块

  • 卸载pydantic并从源代码处安装。希望这将很快在注册表中更新
  • 运行
    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)