使用PyInstaller打包多文件Python项目遇模块找不到错误求助
解决PyInstaller打包时ModuleNotFoundError问题
1. 规范项目包结构
Python需要识别文件夹为可导入的包,给所有需要导入的目录添加空的__init__.py文件,最终结构如下:
├───project │ ├───__init__.py │ ├───gui │ │ ├───__init__.py │ │ ├───gui.py │ │ └───gui.ui │ ├───resources │ │ ├───__init__.py │ │ ├───res.py │ │ ├───res.qrc │ │ ├───res_rc.py │ │ ├───css │ │ │ └───style.qss │ │ ├───icons │ │ │ └───test.png │ │ └───settings │ │ └───settings.ini │ └───source │ ├───__init__.py │ ├───main.py │ ├───manager0 │ │ ├───__init__.py │ │ └───test0.py │ ├───manager1 │ │ ├───__init__.py │ │ └───test1.py │ └───manager2 │ ├───__init__.py │ └───test2.py
2. 修正main.py的导入逻辑
删掉sys.path.append('../project/resources')这行硬编码的路径,改用符合Python包规范的导入方式:
import sys from PyQt5.QtWidgets import * from PyQt5 import QtCore from PyQt5.uic import loadUi # 导入resources下res模块的project对象(根据实际代码调整路径) from resources.res import project # 用相对导入导入source下的子模块,简洁可靠 from .manager0.test0 import * from .manager1.test1 import * from .manager2.test2 import *
如果偏好绝对导入,也可以写成from source.manager0.test0 import *,需保证项目根目录在Python的搜索路径中。
3. 正确执行PyInstaller打包命令
必须从项目根目录(C:\Users\us\project)运行命令,而非source目录:
基础单文件打包
pyinstaller --onefile --name myapp source/main.py
包含资源文件的打包
项目中的ui、qss、图片、配置文件等非代码资源,需要用--add-data参数指定打包时包含:
pyinstaller --onefile --name myapp ^ --add-data "gui/gui.ui;gui/" ^ --add-data "resources/css/style.qss;resources/css/" ^ --add-data "resources/icons/test.png;resources/icons/" ^ --add-data "resources/settings/settings.ini;resources/settings/" ^ source/main.py
注意:Windows系统路径分隔用
;,Linux/macOS用:。
4. 处理PyQt资源文件(可选)
如果res_rc.py是通过pyrcc5生成的Qt资源文件,若打包后出现资源找不到的情况,可添加隐藏导入:
pyinstaller --onefile --name myapp ^ --hidden-import resources.res_rc ^ # 加上其他--add-data参数 source/main.py
5. 验证运行
打包完成后,exe文件会生成在项目根目录的dist文件夹中,直接运行即可,单文件模式下程序会自动临时解压所需资源,无需手动复制文件。
内容的提问来源于stack exchange,提问作者mystic.06
相关产品推荐
相关产品推荐

