python打包gradio 项目exe

/ 默认分类 / 没有评论 / 27浏览

安装打包工具

pip install pyinstaller

进行打包

使用命令 pyinstaller -F app.py 进行打包,其输出如下所示

505731 INFO: Copying icon to EXE
505735 INFO: Copying 0 resources to EXE
505736 INFO: Embedding manifest in EXE
505784 INFO: Appending PKG archive to EXE
505838 INFO: Fixing EXE headers
519361 INFO: Building EXE from EXE-00.toc completed successfully.
520246 INFO: checking COLLECT
520246 INFO: Building COLLECT because COLLECT-00.toc is non existent
520246 INFO: Building COLLECT COLLECT-00.toc
542317 INFO: Building COLLECT COLLECT-00.toc completed successfully.

运行exe

[Errno 2] No such file or directory: gradio_client\types.json

这是由于pyinstaller 没有准确的识别出用于代码中gradio_client与gradio库的依赖项,需要将打包命令修改下命令即可,也就是补充上 --collect-data=gradio_client --collect-data=gradio ,完整命令如下:

pyinstaller -F app.py --collect-data=gradio_client --collect-data=gradio

运行还是报错缺少其他文件,反复发现缺少好多依赖....

查看当前所有依赖

pip freeze

继续打包

pyinstaller --onefile  --collect-all aiofiles --collect-all annotated_types --collect-all anyio --collect-all certifi --collect-all charset_normalizer --collect-all click --collect-all colorama --collect-all dateutil --collect-all fastapi --collect-all ffmpy --collect-all filelock --collect-all fsspec --collect-all gradio --collect-all gradio_client --collect-all groovy --collect-all h11 --collect-all httpcore --collect-all httpx --collect-all huggingface_hub --collect-all idna --collect-all jinja2 --collect-all lxml --collect-all markdown_it --collect-all markupsafe --collect-all mdurl --collect-all multipart --collect-all numpy --collect-all opencc --collect-all orjson --collect-all packaging --collect-all pandas --collect-all pillow --collect-all pip --collect-all pydantic --collect-all pydantic_core --collect-all pydub --collect-all pygments --collect-all python_multipart --collect-all pytz --collect-all requests --collect-all rich --collect-all ruff --collect-all safehttpx --collect-all semantic_version --collect-all setuptools --collect-all shellingham --collect-all sniffio --collect-all starlette --collect-all tomlkit --collect-all tqdm --collect-all typer --collect-all tzdata --collect-all urllib3 --collect-all uvicorn --collect-all websockets --collect-all wheel app.py

再次执行时出现以下报错

FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc

这是由于gradio库中的代码都是pyi文件,而pyinstaller 在打包时默认库中的都是pyc文件,故而需要修改spec文件,指定对gradio库下的代码进行编译。

生成spec文件

pyi-makespec --onefile  --collect-all aiofiles --collect-all annotated_types --collect-all anyio --collect-all certifi --collect-all charset_normalizer --collect-all click --collect-all colorama --collect-all dateutil --collect-all fastapi --collect-all ffmpy --collect-all filelock --collect-all fsspec --collect-all gradio --collect-all gradio_client --collect-all groovy --collect-all h11 --collect-all httpcore --collect-all httpx --collect-all huggingface_hub --collect-all idna --collect-all jinja2 --collect-all lxml --collect-all markdown_it --collect-all markupsafe --collect-all mdurl --collect-all multipart --collect-all numpy --collect-all opencc --collect-all orjson --collect-all packaging --collect-all pandas --collect-all pillow --collect-all pip --collect-all pydantic --collect-all pydantic_core --collect-all pydub --collect-all pygments --collect-all python_multipart --collect-all pytz --collect-all requests --collect-all rich --collect-all ruff --collect-all safehttpx --collect-all semantic_version --collect-all setuptools --collect-all shellingham --collect-all sniffio --collect-all starlette --collect-all tomlkit --collect-all tqdm --collect-all typer --collect-all tzdata --collect-all urllib3 --collect-all uvicorn --collect-all websockets --collect-all wheel app.py

隐藏控制台

添加以下参数 --noconsole

pyi-makespec --onefile --noconsole --collect-all aiofiles --collect-all annotated_types --collect-all anyio --collect-all certifi --collect-all charset_normalizer --collect-all click --collect-all colorama --collect-all dateutil --collect-all fastapi --collect-all ffmpy --collect-all filelock --collect-all fsspec --collect-all gradio --collect-all gradio_client --collect-all groovy --collect-all h11 --collect-all httpcore --collect-all httpx --collect-all huggingface_hub --collect-all idna --collect-all jinja2 --collect-all lxml --collect-all markdown_it --collect-all markupsafe --collect-all mdurl --collect-all multipart --collect-all numpy --collect-all opencc --collect-all orjson --collect-all packaging --collect-all pandas --collect-all pillow --collect-all pip --collect-all pydantic --collect-all pydantic_core --collect-all pydub --collect-all pygments --collect-all python_multipart --collect-all pytz --collect-all requests --collect-all rich --collect-all ruff --collect-all safehttpx --collect-all semantic_version --collect-all setuptools --collect-all shellingham --collect-all sniffio --collect-all starlette --collect-all tomlkit --collect-all tqdm --collect-all typer --collect-all tzdata --collect-all urllib3 --collect-all uvicorn --collect-all websockets --collect-all wheel app.py

修改spec文件

添加gradio的编译

a = Analysis(
    ['app.spec'],
    pathex=[],
    binaries=binaries,
    datas=datas,
    hiddenimports=hiddenimports,
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    module_collection_mode={ 'gradio': 'py',},
    optimize=0,
)

修改后,删除掉目录下的build文件夹,再次执行 pyinstaller app.spec 即可

成功运行

* Running on local URL:  http://10.211.55.5:7860

To create a public link, set `share=True` in `launch()`.