以上省略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. JAVA I/O 与装饰者模式UML图

  2. Java的类锁、对象锁和方法锁

    在Java中,对于synchronized关键字,大家看到的第一反应就是这个关键字是进行同步操作的,即得名"同步锁". 当用它来修饰方法和代码块时,默认当前的对象为锁的对象,即对象 ...

  3. 【NOI Online 2020】入门组 总结&&反思

    前言: 这次的NOI Online 2020 入门组我真的无力吐槽CCF的网站了,放段自己写的diss的文章,供一乐 如下:(考试后当天晚上有感而发) 今天是个好日子!!!(我都经历了什么...... ...

  4. 现代企业要求上什么样的MES(四)

    一个制造企业要想盈利,在生产方面要做的无非是提高资源利用效率和缩短生产通过时间(生产周期),而实现这俩步骤需要生产状况的在线透明及避免薄弱环节的分析数据,由此达到改善生产状态的目的.在erp系统中,通 ...

  5. git&&SourceTree使用总结

    git&&sourceTree操作学习 基本操作 commit 提交 pull 更新代码 push 推送代码 fetch 抓取代码 Branch 新建分支 merge 合并代码 Sta ...

  6. 不需要爬虫也能轻松获取 unsplash 上的图片

    我经常会使用 unsplash, 这里面的图片非常清爽,我的大多数文章的图片都是在这个网上找的,虽然也有同类型网站,但是用过一段时间以后基本都放弃了,图片质量参差不齐,筛选过程太费劲. 但是 unsp ...

  7. [codeforces-315D div2]模拟

    题目:给两个字符串a.b,问从a中删去若干字符后最多可以得到多少个b串的重复串(bb...b的形式,b的长度不超过100),其中a串是由一个长度不超过100的字符串s重复k次得到的 思路: 暴力匹配a ...

  8. [hdu4301]DP

    题意:给一个2*n的矩形块,求把它分成k个连通块的方法数.(有公共边即视为联通) 思路:由于宽度只有2,于是很容易设计状态使问题满足阶段性以及无后效性.具体来说,令dp[i][j][0]和dp[i][ ...

  9. 配置类为什么要添加@Configuration注解呢?

    配置类为什么要添加@Configuration注解呢? 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 推荐阅读: Spring官网阅读 | 总结篇 Spring ...

  10. Pytorch使用分布式训练,单机多卡

    pytorch的并行分为模型并行.数据并行 左侧模型并行:是网络太大,一张卡存不了,那么拆分,然后进行模型并行训练. 右侧数据并行:多个显卡同时采用数据训练网络的副本. 一.模型并行 二.数据并行 数 ...