(python)Pyinstaller应用程序打包以及相关问题

本文介绍了如何使用PyInstaller将Python程序打包成独立可执行文件,包括安装方法、各种参数的含义与使用示例,以及解决打包过程中遇到的问题,如程序闪退、体积过大和特定模块集成等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        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内容如下

from PyInstaller.utils.hooks import collect_submodules

hiddenimports = collect_submodules('win32com')
应用多进程方法 

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

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

import multiprocessing

def worker():
    print('This is a worker process')

if __name__ == '__main__':
    multiprocessing.freeze_support()  # 调用 freeze_support() 函数
    
    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()
pyecharts应用

内容

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

spec文件

 a = Analysis(['main.py'],
          pathex=['.\\'],
          binaries=[],
          datas=[('.\\resource\\datasets', 'pyecharts\\datasets\\.'), 
                 ('.\\resource\\templates', 'pyecharts\\render\\templates\\.')],
          hiddenimports=[],
          hookspath=[],
          runtime_hooks=[],
          excludes=[],
          win_no_prefer_redirects=False,
          win_private_assemblies=False,
          cipher=block_cipher,
          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  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marst·Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值