以上省略pyinstaller安装步骤,直入主题。先分享我的心路历程。

1.pyinstaller -F -i 1.ico UI_Main.py (先在CMD中 cd到 py文件对应的路径)

第一步打包成功,打开EXE,界面正常显示,但是连不上项目的IC板。故看到打包时的warning,怀疑是受此影响,几经辗转查阅,发现所缺的dll都是QT的dll,这里的QT指的是C++版的QT,于是我专程去官网下载安装了一个QT。

于是将所缺的dll如数转移到我的 UI_Main.py的同一根目录下:

2. 再次 pyinstaller -F -i 1.ico UI_Main.py

此时 warning: lib not found 已无,打包完成,再次打开EXE,本人的UI还是无法连结到IC板,而在pycharm工程程序中却是完美运行。这验证说明这些Qt53xx文件是无害的。

3.查阅论坛,很多文章说到pyinstaller 打包时,导入路径的问题,我整理了些许方法,并进行了验证:

(1).主函数 import xx 导入模块,可免去其他形式导入【这里解决:pyinstaller打包后,打开报错:not find xx module】

(2).  pyinstaller -F -i 1.ico UI_Main.py -p 路径/文件【主要解决:import 引发的路径查找不到的问题】

(3).UI_Main.spec文件中 pathex=[],binaries=[],datas=[] 分别添加需要额外添加的导入路径,额外添加的二进制文件,额外添加的数据文件。注意,spec文件搭配的CMD指令是 pyinstaller --clean -F UI_Main.spec -i 1.ico  【--clean是清除pyinstaller 缓存文件,这里如果后接UI_Main.py则会使 spec文件被刷新,所以接的是 UI_Main.spec】

(4).CMD:   pyinstaller -F -i 1.ico UI_Main.py --add-datas=xxx.dll;.    【其实与(3)中添加datas=[]是一样的效果】

(5).主函数添加相应的路径 sys.path.append() 【其实也是和(1)差不多,能添加打包的搜索路径。】

以下是 spec文件的全内容,datas=[]中的"."表示将该文件复制到根路径(UI_Main.py同),并从根路径搜索,添加到打包内容。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['UI_Main.py'],
pathex=['D:\\PyQt\\module\\AxpSys_DEBUG\\axp\\drivers', 'C:\\Python36\\Lib', 'D:\\PyQt'],
binaries=[],
datas=[('xxx1.dll', "."), ('xxx2.dll', "."), ('xxx3.csv', ".")],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='UI_Main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False , icon='1.ico')

  

4.我将这4种方法都试过,确实能解决相应问题,应该也能解决普遍问题。

  但仍未能解决我的UI不能连结IC板卡的问题。于是我思考一下,想到windows连结IC卡时,我是有安装过基于通讯的驱动,那怀疑坚定加肯定一定是,驱动部分的相关文件没有被打包进去。于是,我独立写了一个简单demo,对IC进行通讯的实验,并进行了每一个步骤的print侦测。惊奇的发现成功了!

  这里demo已经连上了IC板卡(也就是单片机啦啦啦),然后我葫芦画瓢,在UI_Main.py上造车,一样的轮子,竟然还是不行!

我努力对照spec 文件发现一模一样,也是根据 pyinstaller --clean -F UI_Main.spec -i 1.ico 相同的指令。我仔细反复查找,终于找到了两者唯一的不同!!!二者唯一不用的是 spec文件中 xxx1.dll 与 xxx2.dll的顺序是相反的【也就是一个1,2,3;另一个2,1,3】,我怀揣着忐忑试探着最后那一丝不似希望的希望。

  最后终于成功了!!!原理驱动装载的顺序也是影响最后IC读写的,我猜测是因为xxx2.dll 中有调用到 xxx1.dll的函数,但是因为我放的顺序是datas=[('xxx2.dll', '.'), ('xxx1.dll','.'), ('xxx3.csv','.')]  导致系统pyinstaller 先导入的xxx2.dll 因为引用不到 xxx1.dll中的函数,而在打包的时候直接报错,当我把顺序调整之后,才能完美运行!

  总结,关于程序需要额外加载的dll 文件【比如:上文提到的Qt53xx.dll此类与程序相关的,皆为内部导入,非额外】,额外具体指的是,在python 程序中使用到的WinDLL等,相关windows驱动时,可视为额外加载dll。

impor ctypes
ctypes.WinDLL('xxx1.dll')
ctypes.CDLL(path,'xxx2.dll')

  故,我这里因为是和单片机通讯,需要加载额外dll,所以会遇到这个问题,希望和我遇到类似问题与坑的同鞋们看到这篇文章与有此受益,感谢阅读,请不要怜惜自己给我点个赞吧。

  欢迎评论交流 pyinstaller 等的相关问题。

  补充一点:我的验证demo是在虚拟环境pipenv中验证的,其实pyinstaller网上的文章大部分是可以借鉴的,只是指令不同而使用时有所误导而已。

pyinstaller打包pyqt5,从入坑到填坑,详解的更多相关文章

  1. oracle入坑日记<三>用户详解(角色理解)

    1   用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...

  2. [python学习笔记] pyinstaller打包pyqt5程序无法运行

    问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...

  3. 纯Socket(BIO)长链接编程的常见的坑和填坑套路

    本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...

  4. Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)

    简介 无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的.别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹.因此在做app自动化道路上也不会是一帆风顺的,你会踩很多坑,这些坑和你 ...

  5. 大数据入门第七天——MapReduce详解(一)入门与简单示例

    一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...

  6. Java面试中遇到的坑【填坑篇】

    看到大家对上篇<Java面试中遇到的坑>一文表现出强力的关注度,说明大家确实在面试中遇到了类似的难题.大家在文章留言处积极留言探讨面试中遇到的问题,其中几位同学还提出了自己的见解,我感到非 ...

  7. .NetCore下使用IdentityServer4 & JwtBearer认证授权在CentOS Docker容器中运行遇到的坑及填坑

    今天我把WebAPI部署到CentOS Docker容器中运行,发现原有在Windows下允许的JWTBearer配置出现了问题 在Window下我一直使用这个配置,没有问题 services.Add ...

  8. java架构之路-(MQ专题)RocketMQ从入坑到集群详解

    这次我们来说说我们的RocketMQ的安装和参数配置,先来看一下我们RocketMQ的提出和应用场景吧. 早在2009年,阿里巴巴的淘宝第一次提出了双11购物狂欢节,但是在2009年,服务器无法承受到 ...

  9. NHiberante从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑

    在.net framework中的创建session代码先贴一个 public class SessionBuilder { private static ISessionFactory _sessi ...

随机推荐

  1. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  2. CentOS联网问题

    CentOS 7安装好了之后,默认是没有自动联网的,每次启动系统后,之前都是要用到的时候手动联网,最近喜欢用无界面的方式登录系统,所以联网显得比较麻烦. 为了解决这个麻烦,必须让系统启动的时候就自动连 ...

  3. andorid jar/库源码解析之错误提示

    目录:andorid jar/库源码解析 错误: 错误1: Error: Static interface methods are only supported starting with Andro ...

  4. 在html中使用vue组件

    最近在维护公司的项目,当我拿到项目时,发现他用了vue. 但是~~仅仅是引用vue.js文件,整体的架构还是html那种,没有用webpack! 当时觉得~哇~原来还可以这样! 然后了解了业务逻辑和代 ...

  5. MODIS系列之NDVI(MOD13Q1)七:时间序列S-G滤波之Python

    时间序列S-G滤波之Python 根据上上篇博文(MODIS系列之NDVI(MOD13Q1)五:NDVI处理流程)做出的NDVI.我们求NDVI时间序列图,但该NDVI时序图为地表各土地类型综合的ND ...

  6. E. Kamil and Making a Stream 区间gcd

    E. Kamil and Making a Stream 这个题目要用到一个结论,就是区间一个区间长度为n的不同的gcd不会超过logn 个, 其实就是知道这个题目可以暴力就好了. 然后就是对于每一个 ...

  7. 微信小程序下拉刷新时有部分区域不随着下拉移动

    问题 区域元素使用(position: fixed),小程序页面下拉刷新时,这部分区域不会随页面下拉移动. 如何解决 删除设置的top属性

  8. 一篇博客带你轻松应对Springboot面试

    1. SpringBoot简介 SpringBoot是简化Spring应用开发的一个框架.他整合了Spring的技术栈,提供各种标准化的默认配置.使得我们可以快速开发Spring项目,免掉xml配置的 ...

  9. 黑马程序员_毕向东_Java基础视频教程——逻辑运算符(随笔)

    逻辑运算符 逻辑运算符用于连接 boolean 型的表达式 & : 只要两边都是 boolean 表达结果,有一个为 false ,则结果就是 false 只要两边都为 true 则结果就为 ...

  10. Java开发架构篇:DDD模型领域层决策规则树服务设计

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...