以上省略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. muduo网络库源码学习————线程特定数据

    muduo库线程特定数据源码文件为ThreadLocal.h //线程本地存储 // Use of this source code is governed by a BSD-style licens ...

  2. 课堂管理系统;在线教辅平台;java课设

    # 白泽智慧教辅平台 **说明:** 运行时需要修改位置: bzedu\src\main\resources\application.properties bzedu\src\main\resourc ...

  3. Redis 到底是单线程还是多线程?我要吊打面试官!

    最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...

  4. P2766 最长不下降子序列问题 网络流重温

    P2766 最长不下降子序列问题 这个题目还是比较简单的,第一问就是LIS 第二问和第三问都是网络流. 第二问要怎么用网络流写呢,首先,每一个只能用一次,所以要拆点. 其次,我们求的是长度为s的不下降 ...

  5. [LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程

    关键词:地基激光雷达 点云模拟 XML文件 作者:李二 日期:07/05/2020 - 08/05/2020 我目前仅仅使用了TLS模式进行模拟,所以先讲一下TLS的模拟经验. ALS和MLS的模拟, ...

  6. 王颖奇 201771010129《面向对象程序设计(java)》第七周学习总结

    实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: A.仅对本类可见-private B.对所有类可见-public C.对本包和 ...

  7. 我的第一个UWP程序

    1.为什么喜欢UWP 本人无悔入网易云音乐,各种设备上都少不了这个红色图标的软件 从win10发布,网易做了UWP版本的云音乐 应用轻巧.简洁.功能全,接着又下了许多UWP的应用 都给人不一样的感觉, ...

  8. Python 记录日志文件

    1.打印到控制台 # -*- coding: UTF-8 -*- import logging def logFileTest(): logging.debug('This is debug') lo ...

  9. 蓝桥杯备战(一)3n+1问题

    [问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1.用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = 22 时该 ...

  10. JDBC09 CLOB文本大对象

    CLOB(Character Large Object) -用于储存大量的文本数据 BLOB(Binary Large Object) -用于存储大量的二进制数据 -大字段有些特殊,不同数据处理的方式 ...