使用pyinstaller打包程序时踩过的坑

一直在学习新的东西,感觉当时学了!懂了!会了!但是过了就忘了!!!深刻反思后,觉得是没有总结的原因。刚好这段时间因为工作需要在学习pyqt,就把自己在使用pyinstaller对程序打包时遇到的一些问题及解决方法总结出来供大家参考,能力有限,若有不对的地方望指正。

pyinstaller命令参数

参数 含义
-F 将程序打包为一个可执行文件
-D Py代码放在一个目录中(默认状态)
-d 打包后的可执行程序为debug模式(打包错误时打印错误信息)
-w 不生成命令行窗口
-n -n softname, 制定软件名称
–icon –icon=图标名,制定软件显示图标
-v –version=版本文件(txt形式),增加软件版本信息
-upx 使用UPX压缩可执行程序

打包步骤

1.安装pyinstaller,需根据实际python开发版本确定安装版本。pyinstaller兼容性不敢过多评价,不同windows版本需要分别打包。
  安装命令:
    pip install pyinstaller
2.安装依赖 pywin32,sip。有其他博主说pywin32不可用pip安装,但试了一下是可以的(手动鬼脸)。
  安装命令:
    pip install pywin32
    pip install sip
3.重点来啦!!!
  方式一:
    打开命令行窗口,进入项目根目录;
    输入命令:pyinstaller 参数 .py文件
    eg. pyinstaller -Fw -n test --icon=“icon.ico” main.py (打包生只有一个文件,没有控制台,名为test,图标为icon.ico的软件)
  方式二:
    打开命令行窗口,进入项目根目录;
    输入命令:
     pyinstaller options name (生成名为name.spec的文件,spec文件记录详细的打包信息)
     pyinstaller -F name.spec (生成单个文件的exe程序)
  运气好的话到这里就结束了,当然大多数情况下是不可能滴!下面来讲讲我遇到的坑。、


坑一

  第一次尝试时没有充分理解命令参数,打包后运行程序弹出控制台窗口并闪退。
解决方法:加入-w命令参数,取消打包时弹出控制台。

坑二

  点击运行打包后的程序,弹出错误信息如下:

在这里插入图片描述
   一脸懵,不知道为啥。在正式打包前请先用-d参数打包,确保打包无误后再打包生成正常模式软件。运行debug模式的程序,在控制台得到错误信息:
在这里插入图片描述
  没有找到模块sip
在这里插入图片描述
  sip模块在安装pyqt5时已附带安装,但名字不同,这里不知道是不是同一个东西?
sip简介:sip是一种工具,用于为c/c++创建python绑定,其包括代码生成器和python模块,此处提供另外一篇博客的解释https://blog.csdn.net/qq_41185868/article/details/80902785
解决方法:直接使用代码引入,from PyQt5 import sip 。

坑三

再次打包,程序正常运行,界面也可以打开了,但不幸的事又发生了,错误信息:
在这里插入图片描述
  提示exit名字错误,又是一脸懵
  解决方法:修改代码,在exit()前加上模块名,sys.exit()

好啦!到这里遇到的坑解决啦,后面说说打包时可能会用到的东西。


技巧

这里的内容也是打包时遇到的,不过个人不认为是坑,所以单独列出来了。

图标替换问题

软件在不同的地方显示时需要不同的尺寸的图标,(如资源管理器里面的列表显示、桌面显示、任务栏显示等),理论上需要四张不同大小的图标合成一张。
图标大小:
在这里插入图片描述
  具体参照:http://stackoverflow.com/questions/3236115/which-icon-sizes-should-my-windows-applications-icon-include
合成工具使用png2icon,下载链接:http://www.winterdrache.de/freeware/png2ico/

缺少动态链接库

Qt自身的运行需要依赖特定的动态链接库,在没有装过Qt和python的计算机上运行pyqt程序会提示缺少必要的dll文件。缺少的文件位置在自己安装的pyqt目录下的QT里,文件夹名字为plugins。该文件下包含四个dll文件,为Qt运行所必须滴。这里给出我的文件地址供参考:C:…\PyQt5\Qt\plugins 。找到plugins文件后,将其复制一份到打包好的exe应用程序同目录下即可。
  现在又有一个问题了,boss只想要一个单一的exe文件,现在多出一个依赖文件十分碍眼,咋办呢?在查看前辈经验后给出如下解决办法,使用虚拟文件打包工具(Enigma Virtual Box)将应用程序和plugins虚拟化为一个exe程序,安装使用方法简单,不会自行百度。好啦,到此算基本完成了,手动开心。

添加版本信息

前面的一系列操作后,软件可以用啦!但是呢没有版本信息啊。
这个好办,使用pyinstaller 内置的grab_version.py 命令获取其他exe的版本文件,格式如grab_version.py :c:/…/…/name.exe。
  获取到文件后复制到自己的项目根目录下,将里面的信息改写为自己的,在打包时使用“-v file=version_file_name.txt”参数将版本信息文件加入到即可。
注:文本中最后一行信息中的两个数字表明软件所属国家及语言:VarFileInfo([VarStruct(u’Translation’, [1033, 1200])])。

第一篇博文终于写完啦!回头看时间跨度写太长了,以后争取一次搞定,不拖拉。

鹿子!

猜你喜欢

转载自blog.csdn.net/qq_42774567/article/details/84700224