pyinstaller使用大全

 更新时间:2023年02月15日 10:46:33   作者:yinchao163  
这篇文章主要介绍了pyinstaller使用大全,pyinstaller可以方便地将脚本编译成exe,本文结合实例代码给大家详细讲解,需要的朋友可以参考下

背景

在python工程完成开发以后需要编译成可执行文件,如此一来生产环境和开发环境隔离开来便于用户使用(可独立使用,无需配置python开发环境),pyinstaller可以方便地将脚本编译成exe

1. pyinstaller的安装

pip install pyinstaller

2. pyinstaller工作原理

  • 先生成一个spec文件(手动或自动均可),该文件决定了实际编译规则
  • 再自动生成一个build文件夹,所有自动编译的中间产物都放在其中
  • 最后生成dist文件夹,存放编译输出

3. pyinstaller打包成exe

3.1 最简单(单个文件):

pyinstaller xxx.py

一般搞法(多文件)

  • 先自动生成spec文件: pyi-makespec xxx.py
  • 再根据自己的实际需求手动修改spec文件
  • 最后统一installer: pyinstaller xxx.spec

F 生成一个单一可执行文件【常用】

w 禁止弹出控制台【常用】

i 修改exe生成的图标【常用】

h 打印帮助信息

v 打印版本信息

d 生成带各种依赖的文件夹,包含exe,dll,以及其他文件

p 指定搜索路径

3.3 spec文件解析

Analysis: 
    ['Console.py','xxx.py'...] <- 此处列出的脚本生成exe后会按顺序依次执行!
    pathex <- 此处为搜索路径
    binaries <- 非python的库文件
    datas <- ini文件,字体,图片,icon什么的
    pure <- python模块
PYZ: <- 不用管
EXE: <- 输出配置
COLLECT: <- 不用管

3.4 打包dll

在生成的spec文件中修改datas字段,形如:

3.5 利用upx压缩exe

UPX下载地址

运行命令: pyinstaller xxx.spec --upx [输出路径]

4. 常见问题

4.1 打包后的文件太大了

方法1 —— 虚拟环境下打包

造成打包文件太大的主要原因是打包了太多不必要的库,比如安装了anaconda。或者自己pip install了太多库。显然要想解决该问题核心就是不要打包那么多的库。

最好的办法是:在一个虚拟环境中单独打包,只打包该程序执行所必备的依赖库

具体操作方法是:

  • 先安装 pipenv工具,在该工具的帮助下创建虚拟环境单独打包

pip install pipenv

  • 进入虚拟环境:

pipenv shell

  • 尝试运行一下应用程序,缺什么包就单独pip install安装什么包

python xxx.py

  • 当前面的应用程序都可以用的时候再安装pyinstaller,然后进行打包即可

pip install pyinstaller ,pyinstaller -Fw xxx.py

  • 退出虚拟环境

exit

关于pipenv更详细使用请参阅

方法2 —— 排除不相干的包

在*.spec的excludes栏目中添加对应的, 常见: excludes=['matplotlib', 'pandas', 'scipy'],

也可以通过命令行排除: pyinstaller.exe --exclude xxx_package yyy.py

4.2 明明python xxx.py能正常使用, 而打包成exe却无法使用了

主要有以下几种现象:

  • 编译后的exe在打包的机器上运行良好,放到别人机器上不能用了。
  • python xxx.py能正常使用, 而打包成exe却无法使用了。

目前所知主要是两个方面的原因:

  • 路径问题。
  • 依赖包的问题。

python脚本执行的默认路径和exe打包后的路径是不一样的,如果软件中存在文件读取等操作,很有可能导致exe找不到资源而运行出错。

解决该问题的方法是路径冻结

#frozen_dir.py
import os,sys
def app_path():
    if hasattr(sys, 'frozen'):
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)

添加frozen_dir.py后,app_path会生成一个绝对准确的基地址,所有的路径以此为基准,如下所示:

import frozen_dir
SETUP_DIR = frozen_dir.app_path()

依赖包的问题往往出现在:在一开始就pyinstaller打包过程序,后续开发时又安装了新模块,如此一来python xxx.py可以正常执行脚本,但是运行xxx.exe报错。

错误根源可能是:pyinstaller是不会更新__pycache__文件夹的,所以后面增加的模块它不知道,也不会打包进去的:

解决方法非常简单:把打包中生成的资源全部删除【__ pycache __, build, dist】,然后重新打包即可

4.3 打包后exe执行速度太慢了啊

解决方法1:精简代码,删除不必要的内容

解决方法2: 用-D -w 打包,缺点是文件太多

pyinstaller -D -w -i icon.ico XX.py

FAQ A: -F打包成的exe可以用,带上-w参数去掉console框就不能用了

Q:暂未解决(跟源码中需要获取cmd执行输出有关)

A:-i增加自定义icon功能后,目录下不含icon资源exe执行异常

Q:暂未解决

A: No module named pkg_resources

Q: 有可能是setuptools版本太高所致(请参考文末扩展知识),pip install setuptools==44.0.0 即可

A:failed to execute pyi_rth_pkgres

Q: 有可能是pyinstaller的版本问题,卸载重新安装一下,参考:

扩展:

Pyinstaller No module named pkg_resources.py2_warn

我通过降低setuptools版本到 44.0.0 后成功解决问题。

pip install  setuptools==44.0.0 

参考链接

pyinstaller踩坑指南

pyinstaller使用详细教程

pyinstaller官网手册

spec修改示例

py,pyc,pyo,pyd的讲解,不同需求不同打包策略

Pyinstaller打包附带DLL、图标和压缩EXE方法

到此这篇关于pyinstaller使用大全的文章就介绍到这了,更多相关pyinstaller使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现全自动安装第三方库的方法

    Python实现全自动安装第三方库的方法

    这篇文章主要介绍了Python实现全自动安装第三方库的方法,一说Python要安装哪个模块,我们第一反应,win+r输入cmd,pip instll安装,但是如果换电脑了,Python第三方库那么多,难道要一次一次的敲击pip install,本文就介绍一个简单的方法解放双手,需要的朋友可以参考下
    2023-07-07
  • python查看文件大小和文件夹内容的方法

    python查看文件大小和文件夹内容的方法

    今天小编就为大家分享一篇python查看文件大小和文件夹内容的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Django集成MongoDB实现过程解析

    Django集成MongoDB实现过程解析

    这篇文章主要介绍了Django集成MongoDB实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Python实战之MNIST手写数字识别详解

    Python实战之MNIST手写数字识别详解

    MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。本文主要介绍了通过 MNIST实现手写数字识别,需要的可以参考一下
    2022-01-01
  • python列表推导式 经典代码

    python列表推导式 经典代码

    这篇文章主要介绍了python列表推导式,文章内容附有经典的详细代码,感兴趣的小伙按可以参考下面文章具体内容
    2021-10-10
  • Python中取整的几种方法小结

    Python中取整的几种方法小结

    这篇文章主要介绍了Python中取整的几种方法,其中包括向下取整、四舍五入取整、向上取整以及分别取整数部分和小数部分。分别都给出了示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,需要的朋友可以参考借鉴。
    2017-01-01
  • python最小生成树kruskal与prim算法详解

    python最小生成树kruskal与prim算法详解

    这篇文章主要为大家详细介绍了python最小生成树kruskal与prim算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 使用Python解析Chrome浏览器书签的示例

    使用Python解析Chrome浏览器书签的示例

    这篇文章主要介绍了使用Python解析Chrome浏览器书签的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • 浅谈python中频繁的print到底能浪费多长时间

    浅谈python中频繁的print到底能浪费多长时间

    今天小编就为大家分享一篇浅谈python中频繁的print到底能浪费多长时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • pytorch 膨胀算法实现大眼效果

    pytorch 膨胀算法实现大眼效果

    在PS中,我们可以利用液化工具对人像进行瘦脸、放大眼睛等系列的常规操作。今天我们来了解一下这些操作的算法原理,并用pytorch 膨胀算法来实现大眼效果,感兴趣的可以了解一下
    2021-11-11

最新评论