您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

使用pyinstaller打包一个小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 使用pyinstaller打包一个小工具
    • 一、环境
    • 二、通过命令行打包
    • 三、通过配置.spec文件打包(推荐)
    • 四、遇到的问题:
      • 1.设置图标
      • 2. 解决pyinstaller不能识别相对路径
      • 3.项目的文件过多,超过pyinstaller的最大搜索次数
  • 总结


使用pyinstaller打包一个小工具


一、环境

Windows 10
python 3.8.5
pyinstaller-4.2

二、通过命令行打包

pyinstaller常用参数:

-F, –onefile 打包一个单个文件,适用于所有的代码都写在一个.py文件里
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,推荐使用
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
–icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py

三、通过配置.spec文件打包(推荐)

  1. 项目结构如下
  • monitor.py为main文件
  • dingtalk为需要第三方SDK包
    pycharm项目目录

项目结构
2. 进入项目目录,打开终端,生成.spec配置文件

pyinstaller -makespec -D monitor.py
  1. 进入monitor.spec文件,配置文件如下
  • pathex:项目的路径
  • datas:需要一起打包进项目的文件,资源
  • hiddenimport:pyinstaller未能识别并自动打包的第三方包,可在这里手动填入
  • excludes:不想被pyinstaller打包进去的包
  • icon:打包后exe主程序的图标(该ico文件放置在与main.py同一目录下)
    spec配置文件
  1. 打开终端,运行sepc配置文件
pyinstaller monitor.spec
  1. 得到monitor.exe可执行文件
    在这里插入图片描述

四、遇到的问题:

1.设置图标

  • 把ico放入到main.py同级目录下,可直接用文件名,ico建议用64*64像素
  • 图标资源可通过阿里矢量图库平台获取
  • 将下载的png图片转换为ico文件
    • 方法1:使用Windows系统自带的看图软件,另存为bmp文件后,直接改文件后缀为ico后,再pyinstaller打包的时候报错:struct.error: unpack requires a buffer of 16 bytes(结构体。错误:解包需要16字节的缓冲区)
    • 方法2(推荐):使用网上在线的png转ico网站,转成64*64像素。友情链接

2. 解决pyinstaller不能识别相对路径

  • 项目中的main文件需要读取argus.txt中的数据,作为参数使用,使用相对路径,打包后无法识别,但能识别绝对路径,可绝对路径不适用项目需求。
  • 解决方法:在main中先获取main文件的绝对路径,然后通过组合得到argus.txt文件的运行路径,只要argus.txt和main在同一路径下。
  • 注意:使用该方法打包后,直接双击打开打包后的exe文件,如果使用系统终端运行会报错,此时路径读取错误
# 获取当前文件的路径
path = os.path.split(os.path.realpath(__file__))[0] + r'\argus.txt'

# 读取参数
with open(path, encoding='utf-8', mode='r') as f:
    for line in f:
        exec(line)
  • 其他获取路径的方法
import sys
import os
print(sys.path[0])
print(sys.argv[0])
print(os.path.dirname(os.path.realpath(sys.executable)))
print(os.path.dirname(os.path.realpath(sys.argv[0])))
print(os.path.split(os.path.realpath(__file__))[0])
# 执行结果
C:\Users\xxx\Desktop\bian
C:/Users/xxx/Desktop/bian/a.py
C:\Users\xxx\Envs\520\Scripts
C:\Users\xxx\Desktop\bian
C:\Users\xxx\Desktop\bian
print(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))   # 项目根目录向前推进两层
print(os.path.dirname(os.path.dirname(__file__)))  # 项目根目录向前推进一层
print(os.path.dirname(__file__))  # # 项目根目录

3.项目的文件过多,超过pyinstaller的最大搜索次数

  • 在spec的文件头添加
import sys
import os.path as osp
sys.setrecursionlimit(5000)

总结

pyinstaller是python比较好用的打包工具。
官方文档:https://pyinstaller.readthedocs.io/en/stable/
GitHub安装下载:https://github.com/pyinstaller/pyinstaller

感谢:https://www.jianshu.com/p/0e3928781a85


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进