当前位置: 首页 > news >正文

很可惜,pyinstaller不是万能的

        近期活不算少,但是真正新的东西很少,基本都是做些相似的功能,所以有精力想想之前悬而未决的问题,比如前两天写的加快软件启动速度的探索,这几天又想起一个之前没有解决的问题,这个问题之前也在博客写过,就是用candas解析blf的功能,当时在没打包之前测试功能都是没问题,但是一打包就会报缺dll,当时没搜到特别准确的答案,后来主观判断是库冲突,但谁知道pyinstaller报错的信息其实是很准确的,就是缺dll,只不没具体报是缺什么dll,导致我当时认为它的报错有问题,不准确。

        本来我也没想解决这个问题,因为之前只有在用candas解析blf出现了这个问题,后来我用底层包代替以后,就没问题了,也就没再深究,结果近期新加一个功能,依赖sklearn,也是一样的报错,才不得不想办法解决。

        这次呢,我没有按之前的想法直接百度,而是顺藤摸瓜,它报什么错,我就从哪里排查,它不是报缺dll吗,那我就看到底缺什么dll,于是我就搜怎么查pyd的依赖,一般情况都是c/c++编译的包会报缺dll的问题,纯python的肯定不会,结果搜到一个工具,dependencywalker,直接把pyd包丢进去就行,带问号的就是缺的dll,但是有些是误报,比如名字里带api-xx的,一般不用管,有了这个工具以后,分析就能往下进行了,我下载了软件,把包丢进去,过了几分钟,果然找到了缺失的dll,然后我就想看看到底是我真的没有这个dll,还是pyinstaller没打包进去,我在site-packages里一搜,发现真是pyinstaller没打包进去,这个dll在一个叫scipy.libs的文件夹里,唉,也行吧,pyinstaller也不是神,它也不知道,scipy还会有个这么个lib文件夹,因为正常这种依赖都会包含在包里面,它这个文件居然是和包文件夹是同级的,具体原因就不清楚了。

        至此,这个问题算是解决了,总结来说就是,在某些特殊情况下,pyinstaller在打包的时候,会漏掉一些dll或者pyd,但是具体是哪些需要我们自己分析,这里我总结一般报这种缺dll或pyd有两种错误,如果是缺dll,它会报load dll failed,如果是缺pyd,它会报no module found类似的错误,这两个报错的解决方式是不一样的,缺dll的话,需要配置一个文件复制,就是直接把放dll的文件夹或者dll拷过来,而缺module的话,可以直接配个hidden-imports,里面写缺失的那个模块的绝对路径类似于sklearn._xxxx.xxx.xxx,这样它就会自动搜到,然后把相应的pyd复制过来。

        另外这次排查问题得到的一个经验就是,pyinstaller的报错基本是准确的,首先要确定排查的方向,方向错了再怎么花时间也是没用,就按它报错的方向找就可以,进行不下去可以找解决你阻碍的方法,而不是换方向,如果实在找不到再换方向,这样才可能把问题解决。

http://www.lryc.cn/news/180718.html

相关文章:

  • 0/1背包问题
  • Redis入门到精通——00数据类型
  • PADS9.5使用记录
  • Axios post请求出现500错误
  • 【Leetcode】171.Excel 表列序号
  • 2023湖南省赛游记/题解
  • 海信电视U8KL使用体验:参数卷,画质技术也独有!
  • E. Mishap in Club
  • UE4 自带体积云应用
  • RTP/RTCP 协议讲解
  • 倒计时15天!百度世界2023抢先看
  • Redis 哈希(Hash)数据类型和命令(数据类型 二)
  • [Linux]线程互斥
  • leetcode-239-滑动窗口最大值
  • 基于大语言模型的智能问答系统应该包含哪些环节?
  • 【Cesium创造属于你的地球】相机系统
  • 运维困局下确保系统稳定的可行性
  • springmvc中DispatcherServlet关键对象
  • 某微e-office协同管理系统存在任意文件读取漏洞复现 CNVD-2022-07603
  • 消息驱动 —— SpringCloud Stream
  • 使用Apache HttpClient爬取网页内容的详细步骤解析与案例示例
  • 传输层协议—UDP协议
  • 【改造中序遍历】 538. 把二叉搜索树转换为累加树
  • 2022年11月工作经历
  • 使用广播信道的数据链路层
  • 第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库
  • excel中将一个sheet表根据条件分成多个sheet表
  • 案例突破——再探策略模式
  • uboot启动流程-涉及lowlevel_init汇编函数
  • 质数距离 - 如何在较合理的时间复杂度内求2e9范围内的质数