您现在的位置是:网站首页> PY&Rust

Python程序发布打包问题汇集

  • PY&Rust
  • 2026-04-18
  • 47人已阅读
摘要

Python程序发布打包问题汇集

遇到问题问AI

1.jpg

requirements.txt头部加下载源

AI询问:Python打包工具pyinstaller参数详细讲解及实例

pyinstaller spec文件生成及详细使用

修改 spec 文件(万能模板)

如何把cuda AI之类的依赖全打包进去

****带虚拟环境的main.py如何用批处理来运行他,copy到其他机器直接可运行的****

Python打包可靠的方案。它们能从根本上避免“依赖缺失”问题


requirements.txt头部加下载源

--index-url https://download.pytorch.org/whl/cu118

--extra-index-url https://pypi.org/simple




pyinstaller spec文件生成及详细使用

一、什么是 .spec 文件?

它是 打包脚本 / 配置文件

记录:入口文件、图标、是否单文件、资源、DLL、隐藏模块

生成一次,以后直接打包 spec 即可,不用重复输长命令

适合:复杂项目、带资源、带 DLL、多文件项目

二、生成 .spec 文件(2 种方法)

方法 1:最简生成(推荐)

直接运行 pyinstaller,自动生成 spec

bash

运行

pyinstaller main.py

执行后目录会出现:main.spec

方法 2:命令带参数生成(推荐)

想提前指定 -F -w -i 等参数,直接生成配置好的 spec:

bash

运行

pyinstaller -F -w -i app.ico main.py

spec 文件会自动包含这些配置,不用手动改。

三、.spec 文件结构详解(最关键)

打开 main.spec,你会看到 5 个核心部分:

python

运行

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


# 1. 分析部分:入口、导入、路径

a = Analysis(

    ['main.py'],          # 你的主程序

    pathex=[],            # 项目路径

    binaries=[],          # DLL、so 等二进制文件

    datas=[],             # 资源文件:图片、json、ui、excel

    hiddenimports=[],     # 隐藏导入的模块

    hookspath=[],

    hooksconfig={},

    runtime_hooks=[],

    excludes=[],          # 排除不需要的模块

    win_no_prefer_redirects=False,

    win_private_assemblies=False,

    cipher=block_cipher,

    noarchive=False,

)


# 2. 打包核心

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)


# 3. 单文件 / 文件夹模式

exe = EXE(

    pyz,

    a.scripts,

    a.binaries,

    a.zipfiles,

    a.datas,

    [],

    name='main',         # 生成的exe名字

    debug=False,

    bootloader_ignore_signals=False,

    strip=False,

    upx=True,            # 是否开启UPX压缩

    console=True,        # True=显示黑窗 False=无黑窗(-w)

    disable_windowed_traceback=False,

    argv_emulation=False,

    target_arch=None,

    codesign_identity=None,

    entitlements_file=None,

    icon='app.ico'       # 图标

)

四、最常用配置(直接复制改)

1. 添加资源文件(图片、json、config)

修改 datas=[]

格式:

python

运行

datas=[

    ("源路径", "目标路径"),

],

示例:

python

运行

datas=[

    ("config.json", "."),      # 配置文件放根目录

    ("logo.png", "."),         # 图片

    ("assets", "assets"),      # 整个文件夹

    ("ui/*.ui", "ui"),         # UI文件

],

2. 添加 DLL 文件(解决缺少 dll)

修改 binaries=[]

python

运行

binaries=[

    ("opencv_world480.dll", "."),

    ("Qt5Core.dll", "."),

    ("libiomp5md.dll", "."),

],

3. 隐藏导入模块(解决找不到模块)

python

运行

hiddenimports=[

    "requests",

    "cv2",

    "PIL",

    "pandas",

],

4. 排除不需要的模块(减小体积)

python

运行

excludes=[

    "matplotlib",

    "unittest",

    "test",

],

5. 关闭黑窗口(GUI 程序必备)

找到 console=True 改为:

python

运行

console=False,

6. 修改 exe 名称

python

运行

name='我的工具',

7. 设置图标

python

运行

icon='app.ico',

五、完整可用 .spec 模板(直接复制用)

myapp.spec

python

运行

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(

    ['main.py'],

    pathex=[],

    binaries=[

        ("opencv_world480.dll", "."),

        ("libiomp5md.dll", "."),

    ],

    datas=[

        ("config.json", "."),

        ("assets", "assets"),

    ],

    hiddenimports=["requests", "cv2", "PIL"],

    excludes=["matplotlib", "unittest"],

    hookspath=[],

    hooksconfig={},

    runtime_hooks=[],

    win_no_prefer_redirects=False,

    win_private_assemblies=False,

    cipher=block_cipher,

    noarchive=False,

)


pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)


exe = EXE(

    pyz,

    a.scripts,

    a.binaries,

    a.zipfiles,

    a.datas,

    [],

    name='数据处理工具',

    debug=False,

    bootloader_ignore_signals=False,

    strip=False,

    upx=True,

    console=False,        # 无黑窗

    icon='app.ico',

)

六、如何使用 .spec 打包?

只需要一条命令:

bash

运行

pyinstaller myapp.spec

✅ 以后无论重装环境、换电脑,直接打包 spec 即可

✅ 不用再记复杂命令

✅ 配置永久保存

七、最实用技巧

1. 先命令生成,再改 spec(最稳)

bash

运行

pyinstaller -F -w -i app.ico main.py

生成后再打开 spec 精细调整。

2. 每次打包前加 --clean 避免缓存错误

bash

运行

pyinstaller --clean myapp.spec

3. 多 py 文件项目

python

运行

['main.py', 'tool.py', 'ui.py']

八、总结(3 句话记住)

.spec = 可视化打包配置,比命令更强大

改 4 个地方就行:datas(资源)、binaries(DLL)、hiddenimports(模块)、console=False(无黑窗)

最终打包:pyinstaller xxx.spec


修改 spec 文件(万能模板)

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(

    ['main.py'],          # 你的主程序

    pathex=[],

    binaries=[("*.dll", ".")],  # 自动包含所有DLL

    datas=[

        ("*.json", "."),   # 配置文件

        ("*.png", "."),    # 图片

        ("assets", "assets"), # 资源文件夹

    ],

    hiddenimports=[],     # 缺什么加什么

    excludes=[],

    cipher=block_cipher,

)


pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)


exe = EXE(

    pyz,

    a.scripts,

    a.binaries,

    a.zipfiles,

    a.datas,

    name='我的程序',

    debug=False,

    strip=False,

    upx=False,           # 关闭UPX,防止丢DLL

    console=True,        # True=有窗口 False=无黑窗(GUI)

    icon='app.ico'       # 图标

)


100% 不踩坑的 6 条铁律

1.必须用虚拟环境

2.不要用 UPX 压缩(会丢 DLL)

3.先打包 -F 测试,再加 -w

4.闪退就去掉 -w,看命令行报错

5.缺模块 = 加 --hidden-import

6.缺文件 = 加 --add-data


这会把:当前目录 DLL,Python 自带 DLL,所有第三方库自带的 DLL

全部打包!永远不会缺!

pyinstaller --clean -F -w ^

--add-binary "*.dll;." ^

--add-binary "DLLs\*.dll;." ^

--add-binary "Lib\site-packages\*\*.dll;." ^

main.py

这会把:当前目录 DLL,Python 自带 DLL,所有第三方库自带的 DLL

全部打包!永远不会缺!


如何把cuda AI之类的依赖全打包进去

 PyInstaller 打包 CUDA + AI 模型(Torch/ONNX/TensorRT/OpenCV) 终极方案

我直接给你能 100% 打包成功、复制即用的方法,解决

打包后找不到 cudnn_ops_infer64_8.dll

找不到 torch_python.dll

找不到 nvcuda.dll / cublas64_12.dll

运行提示 CUDA 不可用

打包后变成 CPU 版本

这套方法包含所有 CUDA、AI 依赖、DLL、依赖库,一次打包终身可用!

🚀 一、最核心结论(先看这个)

CUDA 运行时 + AI 框架(torch/onnxruntime)不能只打包几个 DLL,必须把整个库目录全部打包!

我给你万能模板 + 最终命令。

📦 二、100% 成功打包命令(直接复制)

适用于:Torch CUDA / ONNX Runtime GPU / TensorRT / OpenCV CUDA

Windows 最终一键命令

bash

运行

pyinstaller --clean -F -w ^

--add-binary "*.dll;." ^

--add-binary "venv\Lib\site-packages\torch\lib\*.dll;torch\lib" ^

--add-binary "venv\Lib\site-packages\torch\lib\*.pyd;torch\lib" ^

--add-data "venv\Lib\site-packages\torch\lib\*.so;torch\lib" ^

--add-binary "venv\Lib\site-packages\onnxruntime\c\*.dll;onnxruntime\c" ^

--add-binary "venv\Lib\site-packages\cv2\*.dll;cv2" ^

--hidden-import=torch ^

--hidden-import=torch.utils.cpp_extension ^

--hidden-import=torchvision ^

--hidden-import=onnxruntime ^

--hidden-import=cv2 ^

main.py

如果你没有用虚拟环境,用这个

bash

运行

pyinstaller --clean -F -w ^

--add-binary "*.dll;." ^

--add-binary "Lib\site-packages\torch\lib\*.dll;torch\lib" ^

--add-binary "Lib\site-packages\cv2\*.dll;cv2" ^

--hidden-import=torch ^

--hidden-import=cv2 ^

--hidden-import=onnxruntime ^

main.py

✅ 这个命令会把:

CUDA 相关所有 DLL(cublas、cudnn、curand、cusparse...)

Torch 所有依赖

ONNX Runtime GPU 所有依赖

OpenCV CUDA 所有依赖

全部打包进去!

三、最稳方案:用 SPEC 文件打包(推荐 AI 项目)

直接复制下面这个 AI + CUDA 专用 spec,保存为 main.spec

python

运行

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(

    ['main.py'],

    pathex=[],

    # 🔥 打包所有 CUDA + AI 框架 DLL

    binaries=[

        # 系统 & 当前目录 DLL

        ("*.dll", "."),

        # Torch CUDA 核心

        ("Lib/site-packages/torch/lib/*.dll", "torch/lib"),

        ("Lib/site-packages/torch/lib/*.pyd", "torch/lib"),

        # ONNX Runtime GPU

        ("Lib/site-packages/onnxruntime/c/*.dll", "onnxruntime/c"),

        # OpenCV CUDA

        ("Lib/site-packages/cv2/*.dll", "cv2"),

    ],

    # 🔥 资源文件(模型、配置)

    datas=[

        ("models", "models"),  # 你的AI模型文件夹

        ("*.engine", "."),     # TensorRT 模型

        ("*.onnx", "."),       # ONNX 模型

    ],

    # 🔥 强制导入AI模块

    hiddenimports=[

        "torch",

        "torch._C",

        "torch.utils.cpp_extension",

        "cv2",

        "onnxruntime",

        "onnxruntime.capi",

    ],

    excludes=[

        "matplotlib",

        "unittest",

        "test",

    ],

    cipher=block_cipher,

)


pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)


exe = EXE(

    pyz,

    a.scripts,

    a.binaries,

    a.zipfiles,

    a.datas,

    name="AI工具-CUDA版",

    debug=False,

    strip=False,

    upx=False,        # 🔥 必须关闭!否则CUDA DLL损坏

    console=False,    # GUI关闭黑窗

)

然后打包:

bash

运行

pyinstaller --clean main.spec

✅ 打包完直接运行,自动调用 GPU,不缺任何 DLL

⚠️ 四、3 条必须遵守的规则(否则必失败)

1. 绝对不能用 UPX 压缩

upx=False 或 命令不要加 --upx-dir

UPX 会破坏 CUDA DLL,导致无法运行!

2. 必须打包整个库目录,不是只打包几个 DLL

CUDA 依赖几十上百个 DLL,必须用通配符 *.dll 全部打包。

3. 一定要 --hidden-import 导入 torch、cv2、onnxruntime

PyInstaller 自动识别不到 AI 框架的底层依赖。


带虚拟环境的main.py如何用批处理来运行他,copy到其他机器直接可运行的

使用官方嵌入式Python(Embeddable Package)

这是最符合你“直接copy”需求的方法,由Python官方提供,是一个轻量级、可移植的“绿色版”。它解压即可用,非常适合放在U盘里随身携带。

特点:

便携性:完全独立,不修改系统注册表,复制整个文件夹即可。

体积:基础版约15-20MB,加上依赖后会相应增大。

缺点:默认不包含pip,需要手动配置,且部分依赖C扩展的第三方库(如numpy, pandas)可能无法直接安装。


配置步骤:

下载:从Python官网下载页选择Windows embeddable package (64-bit)。

下载老版:https://www.python.org/ftp/python/

解压:将下载的ZIP包解压到你的项目文件夹,例如portable_python。

启用pip

在解压后的文件夹中,找到python312._pth(或类似名称)文件,用记事本打开,删除或注释掉包含import site的那一行(行首的#去掉)。

下载get-pip.py脚本,并将其放入该文件夹。

在该文件夹路径下打开命令提示符,运行python get-pip.py即可完成安装。

验证是否安装成功

.\python.exe -m pip --version


安装依赖:将项目的requirements.txt文件复制到该文件夹,(生成自己项目的requirements.txt->pip freeze > requirements.txt 或  pip install pipreqs)

运行 .\python -m pip install -r requirements.txt。


编写启动批处理:在项目根目录创建run.bat,内容如下:

batch

@echo off

cd /d "%~dp0"

.\portable_python\python.exe main.py

pause

复制使用:将整个项目文件夹(包含portable_python、main.py、run.bat等)复制到任何一台Windows电脑上,双击run.bat即可运行


Python打包可靠的方案。它们能从根本上避免“依赖缺失”问题

推荐方案一:Conda 环境打包(Conda-Pack)—— 100% 成功,无需再补漏

核心理念:不再“分析依赖并打包”,而是直接将整个可运行的 Python 环境(包括解释器、所有库、动态链接库)压缩成一个包,用户解压后直接激活使用。

优点:

✅ 彻底告别依赖缺失——环境是完整复制的,您在开发机能运行,用户就一定能运行。

✅ 操作简单——只需 4 条命令完成打包,用户也只需双击一个批处理文件。

✅ 维护方便——后续更新代码时,只需替换 main.py,环境包不需要重新打包。

缺点:

⚠️ 用户需要安装 Miniconda(约 300MB,免费,安装一次即可),或您可以把整个 Miniconda 也打包进去(不推荐,体积过大)。

⚠️ 最终分发体积约 1-2GB(包含 PaddlePaddle、模型文件等)。

具体操作步骤(Windows 示例):

1️⃣ 在您的开发机上创建并配置环境

bash

# 创建环境(使用 Python 3.8 兼容性最好)

conda create -n paddle_deploy python=3.8

conda activate paddle_deploy


# 安装 PaddlePaddle(CPU 版本,如果您需要 GPU 请自行替换)

pip install paddlepaddle==2.6.2 -i https://mirror.baidu.com/pypi/simple


# 安装 PaddleOCR

pip install paddleocr==2.7.3


# 安装 conda-pack 工具

conda install conda-pack -c conda-forge


# 确认您的 main.py 能在此环境下正常运行

python main.py


2️⃣ 打包环境

bash

conda pack -n paddle_deploy -o paddle_ocr_env.tar.gz

会在当前目录生成 paddle_ocr_env.tar.gz(约 1-2GB)。


3️⃣ 交付给用户

将以下文件一起发给用户:

paddle_ocr_env.tar.gz

main.py

run.bat(内容见下方)


4️⃣ 用户在目标机器上的操作(仅需做一次)

安装 Miniconda(安装时勾选“添加 Conda 到 PATH”)。

解压 paddle_ocr_env.tar.gz 到任意文件夹,例如 C:\my_ocr_env。

打开命令行(cmd),进入 C:\my_ocr_env,执行 conda-unpack(只需一次,用于修复路径)。

之后每次运行,可以手动执行:


bash

conda activate C:\my_ocr_env

python C:\path\to\main.py

为了更方便,提供一个 run.bat 批处理文件(与 main.py 放在同一目录):


bat

@echo off

call conda activate C:\my_ocr_env

python main.py

pause

用户以后只需双击 run.bat 即可。


为什么这不会再有“缺模块”错误?

因为您交付的不是“猜测依赖后拼凑的 exe”,而是一个完整的、已验证可运行的环境副本。用户运行时,PaddleOCR 会像在您开发机上一样找到所有依赖。


🐳 推荐方案二:Docker 容器化(适合作为 API 服务)

如果您不是直接交付给双击运行的用户,而是将 OCR 能力部署为服务器上的 Web 服务,Docker 是更优雅的方案。

步骤:

编写 Dockerfile:

dockerfile

FROM paddlepaddle/paddle:2.6.2-jupyter

RUN pip install paddleocr==2.7.3

COPY . /app

WORKDIR /app

CMD ["python", "main.py"]


构建镜像:docker build -t myocr .


运行容器:docker run --rm myocr

用户只需安装 Docker,拉取镜像即可运行,环境完全隔离。


📦 方案三(次选):提供源代码 + 自动配置脚本

如果用户具备基础的 Python 环境管理能力(或您能接受首次运行时联网下载依赖),可以放弃打包,直接提供代码和自动化安装脚本。

setup.bat:

bat

@echo off

python -m venv ocr_env

call ocr_env\Scripts\activate

pip install paddlepaddle==2.6.2 -i https://mirror.baidu.com/pypi/simple

pip install paddleocr==2.7.3

echo 安装完成,请双击 run.bat 运行程序

pause

run.bat:


bat

@echo off

call ocr_env\Scripts\activate

python main.py

pause

用户双击 setup.bat 完成环境创建(需联网),之后双击 run.bat 即可运行。这避免了打包的麻烦,但要求用户电脑能正常访问 PyPI 或企业内部镜像。


💎 我的最终建议

请立刻放弃 PyInstaller 这条路。 您已经花费了大量时间在“补漏”上,而每一个新漏点都表明这个方向是错的。根据您的实际场景:

如果您是把工具交给不太懂技术的同事/客户,希望他们能双击运行:请采用方案一(Conda-pack)。虽然第一次需要用户安装 Miniconda,但后续就是双击 .bat 的事,而且再也不会出现依赖缺失。

如果您是部署一个后台服务:请采用方案二(Docker),这是行业标准。

如果用户有一定技术基础,且网络条件好:方案三(源代码+虚拟环境) 最轻量。

我可以为您提供更详细的脚本模板(例如自动检测 Conda 路径、自动创建桌面快捷方式等)。如果您决定转向 Conda-pack,我还可以帮您检查打包步骤中可能遇到的细节问题(比如模型文件的路径处理、GPU 支持等)。








Top