ToB企服应用市场:ToB评测及商务社交产业平台

标题: WxPython跨平台开辟框架之使用PyInstaller 进行打包处理惩罚 [打印本页]

作者: 曂沅仴駦    时间: 2025-1-7 16:17
标题: WxPython跨平台开辟框架之使用PyInstaller 进行打包处理惩罚
使用PyInstaller 打包Python项目是一个常见的需求,它可以将Python程序及其所有依赖项打包成一个独立的可执行文件或者安装文件,方便在没有安装Python环境的机器上运行。本随笔介绍WxPython跨平台开辟框架中使用PyInstaller 进行打包处理惩罚,包括在WIndow平台下天生独立的exe文件,松散结构的exe文件和目录,以及在MacOS上天生安装包的处理惩罚过程。
1. 安装和使用 PyInstaller 进行程序打包处理惩罚

PyInstaller是现在最流行的Python打包工具之一。它可以将Python脚本打包成独立的可执行文件,支持Windows、Linux和macOS平台。
打包后的可执行文件可以在没有 Python 环境的机器上运行。PyInstaller 会主动分析程序的依赖关系,并将所有必要的库和资源打包到一个文件或者一个文件夹中。
cx_Freeze是另一个常用的Python打包工具,同样支持跨平台。
Py2exe是专门用于将Python脚本打包成Windows平台可执行文件的工具。
首先,确保您的Python环境已经安装。然后,通过pip安装PyInstaller。在VSCode或者其他编辑器的下令行(终端)中执行以下下令:
  1. pip install pyinstaller
复制代码
在项目目录下,使用PyInstaller下令来打包您的Python脚本。假设您的主程序文件名为main.py,则可以使用以下下令:
  1. pyinstaller --onefile main.py
复制代码
这里的--onefile选项指示PyInstaller天生一个单独的可执行文件,而不是一个包含多个文件的文件夹。PyInstaller还支持许多其他选项,如--icon来指定应用程序的图标,--windowed或--noconsole来避免在Windows上打开下令行窗口等。
PyInstaller完成打包后,会在dist目录下天生可执行文件(或文件夹,如果您没有使用--onefile选项)。进入dist目录,您应该能看到一个名为main(或您指定的名称,如果使用了--name选项)的可执行文件。
如果统统正常,您的Python程序现在应该会在没有Python环境的环境下运行。
使用PyInstaller打包Python项目是一个简单而强盛的方法,可以让您的程序更加便携和易于分发。通过遵循上述步调,您可以轻松地将您的Python项目打包成一个可执行文件。
常用选项

PyInstaller 提供了很多下令行选项,用于定制打包过程。以下是一些常用的选项:
--onefile

天生单个可执行文件。默认环境下,PyInstaller 会天生一个文件夹,里面包含了可执行文件和所有相关的依赖项。如果你希望打包成一个独立的可执行文件(大概会更大),可以使用 --onefile 选项。
--noconsole

如果你正在创建一个 GUI 应用程序(如使用 wxPython 或 PyQt),而且不希望显示控制台窗口,可以使用 --noconsole 选项。此选项会隐藏控制台窗口,适用于 Windows 和 macOS。
--icon

为天生的可执行文件指定一个图标。图标文件可以是 .ico(Windows)或 .icns(macOS)格式。
--onedir

天生一个包含可执行文件和所有依赖项的文件夹,而不是单个文件。你可以将整个文件夹分发给其他用户。
build 文件夹被PyInstaller用来收集和准备捆绑的文件,它包含分析的结果和一些额外的日志。在大多数环境下,你可以忽略这个文件夹的内容,除非你想调试题目。
dist (代表 "分发")文件夹包含要分发的文件。这包括你的应用程序,捆绑成一个可执行文件,以及任何相关的库(比方WxPython、PyQt6 等)和二进制.so 文件。
 
2、使用.spec文件进行定制打包处理惩罚

打包过程中,PyInstaller 会天生一个 .spec 文件。这个文件包含了 PyInstaller 的设置信息,此中包含了构建过程的所有设置信息。你可以修改这个文件来定制打包过程。
如果我们执行下面代码
  1. pyinstaller main.py
复制代码
或者指定更多的参数的代码
  1. pyinstaller --onefile --icon=your_icon.ico main.py
复制代码
PyInstaller 都会天生一个 .spec 文件,然后可以编辑 main.spec 文件,比方:
  1. # main.spec
  2. # -*- mode: python ; coding: utf-8 -*-
  3. block_cipher = None
  4. a = Analysis(['main.py'],
  5.              pathex=['/path/to/your/script'],  # 项目的路径
  6.              binaries=[],
  7.              datas=[('data/*.txt', 'data')],  # 资源文件
  8.              hiddenimports=['some_module'],  # 隐藏导入模块
  9.              hookspath=[],
  10.              runtime_hooks=[],
  11.              excludes=[],
  12.              win_no_prefer_redirects=False,
  13.              win_private_assemblies=False)
  14. pyz = PYZ(a.pure)
  15. exe = EXE(pyz,
  16.           a.scripts,
  17.           a.binaries,
  18.           a.zipfiles,
  19.           a.datas,
  20.           name='main',
  21.           debug=False,
  22.           strip=False,
  23.           upx=True,
  24.           console=False)  # 设置是否显示控制台
复制代码
一般环境下,我们的.spec文件会比这个更多的内容,固然原则上.spec文件支持跨平台的设置,不外我们在实际中往往根据不同的平台设置特定的.spec文件。
你可以手动修改 .spec 文件来添加资源文件、修改导入模块、定制输出路径等。
你可以通过编辑.spec 文件,在EXE、COLLECT和BUNDLE块下添加一个name= ,为PyInstaller提供一个更好的名字,以便为应用程序(和dist 文件夹)使用。
EXE下的名字是可执行文件的名字,BUNDLE下的名字是应用程序包的名字。
修改完成后,执行以下下令来重新打包:
解决常见题目

PyInstaller 有丰富的文档,提供了详细的使用说明和常见题目解答,你可以通过以下链接访问:
这些文档和资源能资助你深入了解 PyInstaller 的使用方式,并解决在打包过程中大概遇到的题目。
 
3、WxPython跨平台开辟框架中定制不同平台的 .spec文件

前面介绍了,我们推荐使用修改设置.spec文件的方式天生打包文件,而且可以通过定制不同平台的.spec文件,以便实现更好的处理惩罚,避免冲突。
对于不同平台的图标处理惩罚,我们可以使用代码来判断,.spec文件自己可以编写python的代码的。
  1. import sys
  2. import os
  3. from pathlib import Path
  4. if sys.platform == "win32":
  5.     icon = "app/images/app.ico"
  6. elif sys.platform == "darwin":
  7.     icon = "app/images/app.icns"
复制代码
另外我们的业务窗体是动态根据路径解析的,因此在打包的时候,会遗漏的,为了解决这个题目,需要手动把视图部分的模块加载到hidden-import集合中,如下所示。
为了避免手工填写出错和麻烦,使用python函数递归处理惩罚目录的视图模块。
  1. def collect_modules(directory):
  2.     modules = []
  3.     for root, dirs, files in os.walk(directory):
  4.         for file in files:
  5.             if file.endswith(".py") and file != "__init__.py":  # 排除 __init__.py 文件
  6.                 module_path = os.path.relpath(os.path.join(root, file), directory)
  7.                 module_name = module_path.replace(os.path.sep, ".").replace(".py", "")
  8.                 modules.append(module_name)
  9.     return modules
  10. # 使用动态加载目录下的模块方式
  11. hiddenimports = collect_modules("app/views")
  12. hiddenimports = [f"views.{module}" for module in hiddenimports]
复制代码
这样在修改里面的变量即可。
  1. # Analysis: PyInstaller Analysis object
  2. a = Analysis(
  3.     ["app/main.py"],
  4.     pathex=[],
  5.     binaries=[],
  6.     datas=[
  7.         ("app/images/splash.png", "images"),
  8.         ("app/.env", "."),
  9.         ("app/settings.ini", "."),
  10.     ],
  11.     hiddenimports=hiddenimports,
  12.     hookspath=[],
  13.     hooksconfig={},
  14.     runtime_hooks=[],
  15.     excludes=[],
  16.     noarchive=False,
  17.     optimize=0,
  18. )
复制代码
1)WIndows平台的打包文件天生

然后指定EXE(用于Window的处理惩罚打包)
[code]# PYZ: PyInstaller PYZ objectpyz = PYZ(a.pure)# EXE: PyInstaller EXE objectexe = EXE(    pyz,    a.scripts,    a.binaries,    a.datas,    [],    name="wxpython_project",    debug=False,    bootloader_ignore_signals=False,    strip=False,    upx=True,    upx_exclude=[],    runtime_tmpdir=None,    console=False,  # True启用/False禁用下令行窗口    onefile=False,  #




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4