栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pyQT生成的exe通过win32com调用其他QT的exe报错的问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pyQT生成的exe通过win32com调用其他QT的exe报错的问题

自己个人有一个小工具,用于开发效率化的,需要通过win32com去调用其他exe。
然而在某个exe升级后,再使用我的tool去调用该 exe时,会报出如下问题(升级前OKAY)
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

以下是我艰辛的debug步骤,最后附上规避方法
#1.手动打开该exe,可正常使用,无错误报出

#2.我的工具架构时基于python+pyQT的一个纯python方案,我直接运行python脚本,去执行相应的操作,并不会报这个QT插件的error,使用pyinstaller打包后,这个问题必现

#3.基于#2,初步怀疑是pyinstaller有问题,所以尝试写一个最简单的通过win32 dispatch exe的脚本,并通过pyinstaller打包
看以下代码块,按照预期,应该也会报一样的错,然鹅,并没有,正常执行

from win32com.client import Dispatch
import sys
VISIBLE = True
PREFIXLOGNAME = True

def Initxxx():
    xxx_app = Dispatch('xxx.Application')
    if xxx_app == 0:
        print("open xxx application error")
        sys.exit(0)
    print(" Version: "+xxx_app .AppVersion+"n")
    xxx_app .Visible = VISIBLE
    xxx_app .PrefixLogName = PREFIXLOGNAME 
Initxxx()

#4.基于#3,基本可以确定是由于我的tool的PyQT,与要打开exe的QT不兼容,导致的问题,那么又该如何解决呢

Google了一堆,基本都是推荐将pyQT5下面的插件拷贝到pyQT_TOOLs,一一尝试,都没有用,而且这些也都解决不了我的问题,手动打开可以,使用脚本执行打开可以,用pyinstaller打包之后,就报插件error的问题

解决方案:
最后,还是从pyinstaller这个打包方式着手,网上很难找到资料,就是直接运行脚本和用pyinstaller打包有什么区别
我个人怀疑是Pyinstaller打包的某些参数配置,导致了我这个问题,但是在尝试了参数之后,都解决不了问题,应该还是个人学艺不精
无可奈何下,弃用了pyinstaller打包方案,使用了nuitka打包
使用以下命令
–nofollow-imports 使用这个,就不会把各种三方库都打包进来,节约打包时间
-follow-import-to=xxx,xxxx 需要include进来的模块,可以在这里添加,使用相对路径,相对于你的入口文件
nuitka --standalone --mingw64 --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=xxx,xxxx --output-dir=output xxx.py

更多nuitka的资料,请查看其他博主的文章
打包完成后(坑相对比较多),就可以成功运行了,解决了上述的问题,感觉是柳暗花明又一春,哈哈哈,还喜提了一个运行速度加快的好处

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号