当前位置:   article > 正文

(python)Pyinstaller应用程序打包以及相关问题_pyinstaller打包 自定义的pyecharts和wxpython

pyinstaller打包 自定义的pyecharts和wxpython

前言

        PyInstaller 可以将 Python 程序打包为独立的可执行文件,不需要用户手动安装 Python 和相关依赖。这使得分发和部署变得更加简单,方便将 Python 程序交付给其他用户或客户。

目录

安装

相关参数

使用样例

简单使用

进阶使用

高阶使用 

问题和解决方法

一般常见问题

解决办法

程序闪退

体积过大

 特殊问题

应用pywin32模块

应用多进程方法 

pyecharts应用


安装

pip install pyinstaller

相关参数

  • -F--onefile:生成单个独立的可执行文件而不是一个文件夹,这对于分发和部署来说更方便。

  • -w--windowed:在 Windows 上生成一个没有控制台窗口的可执行文件,适用于 GUI 应用程序。

  • -c--console:在 Windows 上生成一个带有控制台窗口的可执行文件,适用于命令行应用程序。

  • -n NAME--name=NAME:指定生成的可执行文件的名称。

  • -i ICON--icon=ICON:指定可执行文件的图标文件。

  • --add-data "SRC;DEST":将额外的非 Python 文件(例如配置文件、数据文件等)复制到可执行文件的目录下。

  • --add-binary "SRC;DEST":将二进制文件(例如 DLL 文件)复制到可执行文件的目录下。

  • --hidden-import MODULE:手动添加导入的模块,以确保它们被正确地包含在可执行文件中。

  • --exclude MODULE:排除特定的模块以减小可执行文件的大小。

  • --upx:使用 UPX 压缩可执行文件,这可以减小文件的大小。

使用样例

简单使用

pyinstaller xxx.py

进阶使用

pyinstaller -Fw D:\my_Script.py -i D:\my.ico --distpath D:\dist_tool --name my_Tool --upx-dir D:\dist_tool\upx-4.0.2-win64

高阶使用 

修改spec文件,使用spec进行打包.

pyinstaller -Fw D:\my_Script.spec

问题和解决方法

一般常见问题

  1. 打包后的程序无法运行
  2. 打包后的程序体积较大
  3. 打包后的程序出现兼容性问题
  4. 打包后的程序出现运行效率等问题
  5. 打包后的程序出现安全问题

解决办法

程序闪退
  • 文件路径和相对路径:由于 PyInstaller 将所有文件打包成单个可执行文件,因此文件路径和相对路径可能会发生变化。确保你的程序中使用了相对路径或动态获取文件路径的方法,以避免在打包后无法找到文件的问题。

  • 依赖管理:PyInstaller 会尝试自动检测和打包程序所依赖的库和资源文件,但有些情况下可能会出现依赖管理的问题。确保你在打包前已经安装了所有程序所需的依赖,并且这些依赖对于 PyInstaller 是可访问的。如果遇到依赖未被正确打包或加载的问题,可以考虑手动添加依赖项。

体积过大
  • 针对该项目用到的依赖库,单独配置一套打包用的极简环境.
  • 使用--upx参数,在引进压缩工具的帮助下,减少打包程序的体积;

 特殊问题

应用pywin32模块

问题出在pyinstaller包不能正常找到pywin32模块的位置

需要在目录 Lib\site-packages\PyInstaller\hooks手动创建添加一个文件

hook-win32api.py

 hook-win32api.py内容如下

  1. from PyInstaller.utils.hooks import collect_submodules
  2. hiddenimports = collect_submodules('win32com')
应用多进程方法 

如果 Python 解释器被打包成可执行文件(例如使用 PyInstaller、py2exe 等工具),子进程的启动方式会与普通的 Python 脚本运行方式稍有不同。

freeze_support() 函数的作用是检查当前脚本是否正在被打包成可执行文件,如果是,则执行一些必要的初始化操作,使子进程能够正常工作。如果没有调用 freeze_support() 函数,可能会导致子进程无法正确启动或运行。(避免子进程重复启动)

  1. import multiprocessing
  2. def worker():
  3. print('This is a worker process')
  4. if __name__ == '__main__':
  5. multiprocessing.freeze_support() # 调用 freeze_support() 函数
  6. p = multiprocessing.Process(target=worker)
  7. p.start()
  8. p.join()
pyecharts应用

内容

        需要将pyecharts应用于独立GUI软件/CS架构开发

spec文件

  1. a = Analysis(['main.py'],
  2. pathex=['.\\'],
  3. binaries=[],
  4. datas=[('.\\resource\\datasets', 'pyecharts\\datasets\\.'),
  5. ('.\\resource\\templates', 'pyecharts\\render\\templates\\.')],
  6. hiddenimports=[],
  7. hookspath=[],
  8. runtime_hooks=[],
  9. excludes=[],
  10. win_no_prefer_redirects=False,
  11. win_private_assemblies=False,
  12. cipher=block_cipher,
  13. noarchive=False)

处理流程 

  1. 创建resources文件夹 pyecharts资源文件datasetstemplates整合至特定目录下(如打包目录下./resources文件夹)
  2. 修改Spec文件 已有pyinstaller生成的.spec文件(每次执行pyinstaller都会生成一个spec文件)修改datas字段(元组中左侧元素为资源文件路径,右侧是打包后相对于临时文件夹路径拷贝位置)
  3. 执行打包  指令pyinstaller main.spec -Fw

注意:spec文件最好和resources文件夹在同一层级,方便找到. 

参考链接 pyecharts官方地址icon-default.png?t=N7T8https://pyecharts.org/#/zh-cn/pyinstaller_pack  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/867577
推荐阅读
相关标签
  

闽ICP备14008679号