最近打算把自己写的程序用pyinstaller做一个打包,以便在其他电脑上使用,本来以为挺简单的事情,没想到搞了两天时间才搞定,期间遇到诸多坑,忍不住要骂娘了。

平心而论,搞不定只能是自己学艺不精,所以只能调整好心情,挨个去排除异常,面向csdn编程。

提醒:

如果你打包的程序是单文件,并且不依赖于第三方库、第三方软件,那就没必要看本文。网上大把的教程,一行命令就成功打包了。

如果你的项目文件写的比较正规、多目录、并且还依赖了第三方的软件或文件等等,那本篇文章是比较有参考价值的。

我的项目目录如上图。


ok,进入正题。

需要说明的是,每个人的python解释器版本不同,甚至用到的pyinstaller版本不同,都会产生各种问题。

总体思路:

项目完毕后,在自己的pycharm里先运行,看是否报错,报什么错。将报错信息复制到别的文档中去,方便挨个排查。

报错信息通常都包含关键词:error、warning。

所以,你只需要在你刚才粘贴过去的文档 ctrl+f,然后查找错误信息即可。

第一部分:pyinstaller常见错误应对方案

常见错误1:UPX is not available

有英文基础的话,就很清楚的知道,它说的是upx不可用。

因为pyinstaller打包会用到压缩功能,而这个功能依赖于UPX,UPX是一款压缩软件,所以,你应该下载UPX的安装包,然后把upx.exe文件放在项目虚拟环境中的Scripts文件夹下。

具体操作方法看这篇参考文章:

pyinstaller打包时提示UPX is not available._Veiko的博客-CSDN博客

常见错误2:致命问题、pyinstaller版本问题导致出现以下问题:

第一种:TypeError: an integer is required

第二种:win32*******.error 。比如文件找不到,外部卷被破坏之类各种win32错误

如果你遇到这两种错误,先卸载你的pyinstaller。重新用下面的命令安装

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz

我使用这个办法,成功解决了上面两种错误。

参考文章:

python用pyinstaller生成exe时报错 TypeError: an integer is required (got type bytes)_TLScott的博客-CSDN博客


ok,上面是常见错误,一般刚开始用pyinstaller都很容易遇到,下面再说一些我遇到的其他错误

错误三:pyinstaller打包moviepy时各种报错

凡是你用到moviepy库,总是会遇到各种奇葩报错。

背后真正的原因是,我们使用的第三方库在运行时,也会导入其他第三方的库。专业名词叫隐藏导入。

大多数模块的开发者都会根据python版本的变化,及时更新正确的语法和用法。

但是moviepy的开发者就偷懒了,使用了一种偷懒的方法去导入第三方库。

所以,我们在用的时候,会报各种乱七八糟的错。

解决办法是,修改下面两个文件的内容。

 注意,是all文件夹下面的--init--.py,别修改错了

打开后页面如下:

我们这里修改的是moviepy.audio.fx.all.__init__.py, 另外一个moviepy.video.fx.all.__init__.py也做同样操作。

注意,不要修改错了,是all文件夹下面的__init__,不是它的同级目录的init。

另外:网上别人给出的代码不要直接复制过去,一定要像我上面演示的一样,手动打印结果,再复制修改。

因为每个人的moviepy版本可能都不一样,你复制别人的代码,到时候还是可能会报错!

参考文章:

​​​​​​moviepy应用pyinstaller打包后执行报错AttributeError: module audio/video.fx.all has no attribute fadein、crop_LaoYuanPython的博客-CSDN博客c


错误四:pyinstaller打包后运行报错,路径找不到。

自己在pycharm里运行,完全没问题,直接在打包后的目录里运行也没问题。

换个目录运行或者换个电脑,就报错。

老手一看,哎,这不就是相对路径没用好么,把项目里的绝对路径改为相对路径。这样换目录、换电脑运行不就可以了?

思路完全正确,不过可能依旧解决不了问题!

我就遇到了,死活搞不定,明明打包后的文件夹里就有配置文件,就是获取不到文件路径。

最后使用了‘冻结路径’的方法配置资源文件路径,程序成功运行。

简单的说,就是在自己项目的根目录中再创建一个py文件,里面定义两个函数,来做一些判断。

这样,程序会根据不同的运行回来,来取不同的值

自己的哪个模块需要使用资源文件,就在对应的py文件中导入这个自定义的模块frozen.py,然后来获取路径的值。

表达的有点绕口,截图展示一下。

比如我的业务代码都在src文件中,需要用到这些资源文件的地方,就用上面我们自定义的模块的函数来取值即可。

至此:程序已经成功运行,在别的电脑也没问题。

参考文章:Python项目打包后找不到路径问题,将资源文件数据文件打包到exe文件中_马克图布s的博客-CSDN博客_python打包路径问题

二:spec文件配置文件简介

打包多文件夹、并且还要依赖其他的一些字体文件、音视频文件、甚至第三方软件、亦或者一些dl文件,都需要在spec里配置。

配置好了之后直接 pyinstaller xxx.spec即可。

这是必须要学会的技巧。

spec文件可以使用命令 pyi-makespec xxx.py 即可生成,其中xxx是你的项目入口文件

生成之后,我们主要需要配置的就是这4个地方,其他的无伤大雅。

咱主要说一下这个datas参数

可以看到datas是一个列表,列表的元素只能是元组,元组第一个元素是你想要打包的文件或者文件夹路径,右边是打包后的程序目录路径。

  1. 如果需要打包一整个文件夹下面的所有内容,需要写入(‘filename’,'filename')
  2. 如果只需要打包某一文件夹写的某一文件,写入格式(‘filedir/filename’,‘‘filedir/filename’’)
  3. 如果想打包某一文件到程序的根目录,写入格式(‘filename’,‘.’),左边是文件,右边写一个点就可以了。
  4. 项目运行中的py文件,不需我们手动配置,自己会打包的。
  5. 非py文件所在的文件夹,如果不手动配置,则不会打包。比如我的项目目录下有虚拟文件的目录venu,如果不添加到datas列表中,则不会被打包。一般情况下也无需打包,特殊情况可能需要打包。

这些配置完毕之后,运行pyinstaller xxx.spec即可,打包后的程序在dist目录下。


还有一个问题:

使用.cfg文件配置文件路径有一个坑,这里说明一下。

cfg文件里的路径,不要加引号,直接写上去就可以了。

如果加了引号,会导致configparser模块获取到的路径和你配置的不同,会引起一些不必要的错误。

比如,我就遇到了,很抓狂....

抓耳挠腮半小时,灵光一闪,是不是配置文件的路径不需要引号呢,修改一下就正常了.....


如果你也被pyinstaller折磨,建议阅读,pyinstaller打包教程。相关推荐

  1. PyInstaller 带静态依赖文件打包教程

  2. 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)

    目录 打包前置知识 一.什么是exe可执行文件? 二.为什么要将 Python 程序打包为 exe 可执行文件? 三.为什么 Python 程序不能直接运行呢? 四.我们用什么来打包 Python 文 ...

  3. pyinstaller打包教程及错误RuntimeError: Unable to open ./shape_predictor_68_face_landmarks.dat

    pyinstaller打包教程及错误RuntimeError: Unable to open ./shape_predictor_68_face_landmarks.dat pyinstaller基本 ...

  4. 【Python】pyinstaller模块将py文件打包为windows可执行文件exe

    python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速.当然打包的脚本似乎不是在所有的win平台下都能使用,win7有一部分不 ...

  5. 【转载】安装pip、pyinstaller并将py脚本打包成exe文件

    exe文件也就是可以直接执行的文件.通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执 行,每次通过Win + R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd ...

  6. 如何使用pyinstaller将Python的代码打包

    如何使用pyinstaller将Python的代码打包 首先要安装pyinstaller pyinstaller使用 首先要安装pyinstaller 一.pystaller下载 打开cmd输入:pi ...

  7. 大师的话一语道破.强烈建议阅读

    作为一个程序开发人员强烈建议阅读: 一下转自孟岩老师博客,大家一起学习吧 现在的开发工作要求我们能够快速掌握一门语言.一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Googl ...

  8. 利用pyinstaller将python项目脚本打包成可执行文件

    利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...

  9. 在Anaconda3(D盘)中安装PyInstaller第三方库并导入pycharm,在PyCharm中和使用PyInstaller对py程序进行打包的方法

    安装PyInstaller第三方库: 本人采用的是Pycharm+Anaconda3,PyCharm装在D盘PyCharm文件夹,Anaconda3装在D盘Anaconda3文件夹. 安装时打开Ana ...

最新文章

  1. python 苹果李子橙_Python模块知识6:OS、SYS模块
  2. 如何将git上的代码迁移到Coding上
  3. 小学四年级下册计算机考试试题,四年级信息技术下学期测试题
  4. The Common Language Runtime (CLR)
  5. 计算机编码发明者,“自然码”的发明者周志农在从计算机*毕业后的,才有了第一只...
  6. 最新xampp下安装mod_security,mod_evasive,mod-cband笔记
  7. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  8. Gmuplolader1.0正式上线,欢迎试用!!!
  9. 关于PHP的OpenSSL的加密问题
  10. 归并排序 c++_数据结构:排序(4)||有序表的归并(归并排序)、基数排序
  11. 台式计算机usb口不识别鼠标,usb鼠标不能识别怎么办解决教程
  12. 模拟银行转账(java+mysql+tomcat +JDBC+ druid连接池 + Servlet + Ajax)
  13. 动态交叉表(永洪bi)
  14. snort安装使用教程
  15. SpringBoot非官方教程 | 第二十五篇:2小时学会springboot
  16. Cascade:自动化测试“旅程”
  17. python抓取网易云音乐评论_如何爬取网易云音乐评论?
  18. winedt103系统找不到指定文件_latex排版(CTeX winEdit输出“系统找不到指定的文件”的终极解决办法)...
  19. ubuntu系统安装到移动硬盘
  20. Python如何利用双色球每天薅个煎饼果子

热门文章

  1. 别忽略国美之争的真正遗产
  2. 流,向量场,和微分方程
  3. 渗透测试-安服面试点总结
  4. 安卓微信8.0.22 正式版,5个隐秘改变你发现了吗?
  5. Android开发——编译FFmpeg(一、前言)
  6. Python制作日历
  7. sap BusinessObject Enterprise XI 4.0 安装载图
  8. Mac JER10.7.3安装
  9. 解决小程序自定义底部菜单切换闪动
  10. 电车防盗报警器电路原来是这样的!