【问题标题】:PyInstaller and FastAPI (maximum recursion depth exceeded)PyInstaller 和 FastAPI(超出最大递归深度)
【发布时间】:2020-08-12 22:12:14
【问题描述】:

我有一个使用 fastapi 作为网络界面的 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

我将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)

【问题讨论】:

标签: python pyinstaller fastapi


【解决方案1】:

我今天也遇到了同样的问题,发现问题出在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]

这会解决最大递归深度问题,但会在Uvicorn遇到另一个问题:

Traceback (most recent call last):
  File "logging/config.py", line 388, in resolve
AttributeError: module 'uvicorn' has no attribute 'logging'

我用Hypercorn + Uvloop 替换了Uvicorn,现在效果很好。

这是我的最终代码:

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))

【讨论】:

【解决方案2】:

使用@UFO 回答我还更新了 PyInstaller 以包含隐藏模块

  1. 卸载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]
  1. 运行pyinstaller main.py

  2. 将这些隐藏的导入添加到pyinstaller生成的.spec文件中

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',
            ]
  1. 运行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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2020-10-08
    • 2018-12-03
    • 2013-12-01
    • 1970-01-01
    • 2017-03-24
    • 2011-12-31
    相关资源
    最近更新 更多