使用PyInstaller生成可执行文件时如何引入依赖包并实现轻量化?
问题描述
尝试创建.exe文件时遇到依赖包导入错误,已配置hiddenimports:
hiddenimports=['pandas', 'sys', 'os', 'tkinter', 'requests', 'openpyxl']
在虚拟环境中执行了以下PyInstaller打包命令:
pyinstaller --noconsole --name="Display Catalog" --icon="icone.ico" --add-data="icone.ico;." --hidden-import pandas --hidden-import sys --hidden-import os --hidden-import tkinter --hidden-import requests --hidden-import openpyxl --onefile main.py
但运行生成的.exe时出现如下错误:
Traceback (most recent call last): File "main.py", line 5, in <module> ModuleNotFoundError: No module named 'openpyxl'
需要解决两个核心问题:
- 如何将所有依赖包正确包含到.exe中
- 如何让生成的.exe保持轻量化,方便分享给没有Python及相关依赖的用户
解决方法
一、修复openpyxl导入失败问题
确认虚拟环境已装全依赖:
运行下面的命令,确保openpyxl和其他依赖都在当前虚拟环境中正确安装:pip install openpyxl pandas requests tkinter(PyInstaller只会打包当前环境已安装的包,漏装依赖是最常见的原因)
用spec文件统一管理打包配置:
不要同时在命令行和spec文件里重复配置hiddenimports,建议用spec文件更清晰:- 先生成基础spec文件:
pyinstaller --noconsole --name="Display Catalog" --icon="icone.ico" --add-data="icone.ico;." --onefile main.py - 打开生成的
Display Catalog.spec文件,找到hiddenimports字段,修改为:
(sys、os、tkinter属于Python标准库,PyInstaller会自动识别,无需手动添加;pandas部分功能依赖隐式导入的包,需要额外指定)hiddenimports=['openpyxl', 'pandas._libs.tslibs.timedeltas'] - 用spec文件重新打包:
pyinstaller "Display Catalog.spec"
- 先生成基础spec文件:
极端情况:强制指定openpyxl路径:
如果还是报错,在spec文件的datas列表里添加openpyxl的安装路径:datas=[('路径/to/openpyxl', 'openpyxl')]路径可以通过
pip show openpyxl命令查看Location字段获取,拼接上openpyxl文件夹即可得到完整路径。
二、实现.exe轻量化
严格控制虚拟环境依赖:
虚拟环境只装项目必需的包,不要安装开发工具(比如pytest、flake8),用pip list检查,把没用的包删掉。考虑用
--onedir替代--onefile:--onefile会把所有文件打包成单个exe,运行时会自动解压到临时目录,体积更大且启动慢;--onedir会生成一个文件夹,包含exe和所有依赖文件,体积更小、启动更快,分享时把整个文件夹压缩即可。清理冗余依赖:
- 如果只是简单读写Excel,直接用openpyxl替代pandas能大幅减少体积;
- 用
pip-autoremove工具清理未被依赖的包:pip install pip-autoremove pip-autoremove 多余包名称 -y
用UPX压缩exe:
下载UPX压缩工具,打包时添加--upx-dir参数指定UPX路径,能有效压缩exe体积:pyinstaller --upx-dir="path/to/upx文件夹" "Display Catalog.spec"
内容的提问来源于stack exchange,提问作者CED
相关产品推荐
相关产品推荐

