我正在开发一个由多个 Python 文件和文件夹组成的 PySide6 应用程序。当我使用
python main.py
运行项目时,一切都很完美。但是,我正在努力将其转换为独立的 .exe
文件,其中包含所有必要的文件和资源。
这是我的项目的结构:
MyProject/ # A folder
├── main.py # Entry point of the application
├── models.py # A file
├── staff.db # A file
├── utils.py # A file
├── photos/ # Contains image resources
├── views/ # A folder
│ ├── __init__.py
│ ├── main_app.py # Contains the MainApp class used in main.py
│ ├── admin_views/ # A folder
│ │ ├── __init__.py # A file
│ │ ├── admin_file1.py # A file
│ │ ├── admin_file2.py # A file
│ │ ├── ... # Other files in admin_views
│ ├── ... # Other Python files related to the views
当我尝试打开生成的
.exe
时,出现以下错误:
ModuleNotFoundError: No module named 'views'
应用程序以
main.py
开头,它从MainApp
导入views/main_app.py
类。该文件与 views
文件夹和项目其他部分中的其他文件和资源进行交互。
我使用以下 PyInstaller 命令将我的
main.py
文件转换为可执行文件:
pyinstaller --name "MyProject" --onefile --windowed --icon=resources/icon.ico main.py
运行
.exe
后,我收到一个错误消息框,上面写着:
ModuleNotFoundError: No module named 'views'
这表明 PyInstaller 在最终构建中不包含
views
文件夹(或其他资产)。
当我使用
python main.py
运行该应用程序时,该应用程序运行良好。
我怀疑 PyInstaller 没有捆绑我的项目中的所有文件、文件夹和依赖项。
views
文件夹包含多个Python文件,并且main.py
依赖于MainApp
中的views/main_app.py
类。
admin_views
内还有一个views
文件夹,其中包含所需的其他模块。
如何确保 PyInstaller 在转换过程中包含我的项目中的所有文件、文件夹和资产?
对于像我这样的多文件项目是否有特定的 PyInstaller 配置或方法?
我应该使用
--onefile
,还是有更好的方法来处理此类项目?
任何成功地将我的整个项目捆绑到
.exe
的指导或解决方案将不胜感激!
我使用以下 PyInstaller 命令来生成可执行文件:
pyinstaller --name "MyProject" --onefile --windowed --icon=resources/icon.ico main.py
运行
.exe
后,遇到了上面提到的错误。
此外,我尝试了以下方法来解决该问题:
将
__init__.py
文件添加到相关文件夹以使它们成为正确的 Python 模块。
检查 PyInstaller 是否自动包含
views
和 admin_views
等文件夹。
使用
--paths
标志运行 PyInstaller 以显式包含 views
文件夹
我想创建一个独立的
.exe
文件,其中包含项目中的所有文件和依赖项,以便应用程序的行为与我运行 python main.py
时的行为相同。具体来说:
.exe
应该可以毫无错误地找到并使用 views
和 admin_views
模块。
所有资产,如数据库 (
staff.db
) 和资源(photos
文件夹),都应打包在可执行文件中。
# MyProject.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.py'],
pathex=['.'],
binaries=[],
datas=[('photos', 'photos'), ('staff.db', '.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='MyProject',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
icon='resources/icon.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='MyProject',
)