当前位置:   article > 正文

pyinstaller打包技巧

pyinstaller打包

简介

当我们使用Python开发好程序需要打包成exe时,主流的做法便是使用pyinstaller,这玩意,看似简单,其实挺麻烦的,坑比较多,特别是涉及到比较复杂的库时,另外一个麻烦的事情是,打包失败后,搜索到的很多解决方案是没有效果的。

前一段时间,我用Python开发了视频同步助手,也是用pyinstaller打包的,其中涉及到opencv-python、ffmpeg、moviepy等包,嗯,这个过程比较磨人,在我配合pyinstaller源码与其文档后,掌握了一些技巧,本文简单总结记录一下,希望对你有所帮助。

动态导入问题

如果你项目中使用了opencv-python库,简单利用pyinstaller打包,很容易出现打包成功了,却无法运行exe的情况,如下图:

e761845bd8fdba247013853ea469fd75.png

从报错细节来看,它让你检查OpenCV是否安装(Check OpenCV installation),但这其实不是报错原因,核心在这句:

native_module = importlib.import_module("cv2")

importlib库在业务型项目中是比较少使用的,其作用就是动态载入相应的库,而我们在日常的业务开发中,使用import关键字来实现库的载入。

很多Python开源项目会使用importlib来实现插件系统,值得学习,但这里却因为importlib的原因,让pyinstaller打包失败。

阅读pyinstaller文档中的【What PyInstaller Does and How It Does It】小节,可知,pyinstaller在打包时,会将项目的依赖也打包进来,但不包含下面几种情况:

  1. 实现了__import__()方法的类实例,在项目中使用时,无法被pyinstaller检测

  2. 通过importlib.import_module()方法导入的库,无法被pyinstaller检测

  3. 通过sys.path执行的逻辑,无法被pyinstaller检测

嗯,pyinstaller存在这些局限,而很多知名的库却大量出现上面的三种情况,比如Django、opencv-python。

怎么办?文档给出了4种解决方案:

  1. 通过pyinstaller命令行打包时,通过相应的配置参数,给出额外的信息

  2. 将项目修改成使用import关键字导入的形式

  3. 编写spec文件,给出额外信息,这与第1种方法相同,命令行上指定的参数,等价于spec配置文件中的配置

  4. 使用hook,实现动态替换

首先排除方法2,因

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/768058?site
推荐阅读
相关标签
  

闽ICP备14008679号