如何使用 pyinstaller 将 python (.py) 文件转换为可执行 (.exe) 文件?

问题描述 投票:0回答:1

我正在开发一个由多个 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
    文件夹,其中包含所需的其他模块。

问题

  1. 如何确保 PyInstaller 在转换过程中包含我的项目中的所有文件、文件夹和资产?

  2. 对于像我这样的多文件项目是否有特定的 PyInstaller 配置或方法?

  3. 我应该使用

    --onefile
    ,还是有更好的方法来处理此类项目?

任何成功地将我的整个项目捆绑到

.exe
的指导或解决方案将不胜感激!


我使用以下 PyInstaller 命令来生成可执行文件:

pyinstaller --name "MyProject" --onefile --windowed --icon=resources/icon.ico main.py

运行

.exe
后,遇到了上面提到的错误。

此外,我尝试了以下方法来解决该问题:

  1. __init__.py
    文件添加到相关文件夹以使它们成为正确的 Python 模块。

  2. 检查 PyInstaller 是否自动包含

    views
    admin_views
    等文件夹。

  3. 使用

    --paths
    标志运行 PyInstaller 以显式包含
    views
    文件夹

我的期待

我想创建一个独立的

.exe
文件,其中包含项目中的所有文件和依赖项,以便应用程序的行为与我运行
python main.py
时的行为相同。具体来说:

  1. .exe
    应该可以毫无错误地找到并使用
    views
    admin_views
    模块。

  2. 所有资产,如数据库 (

    staff.db
    ) 和资源(
    photos
    文件夹),都应打包在可执行文件中。

pyqt5 pyinstaller pyside6 pyqt6
1个回答
0
投票
# 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',
)
© www.soinside.com 2019 - 2024. All rights reserved.