【坑死不偿命】之 Python Qt5 在 Centos7 Desktop 环境下打包

前言

最近有帮我朋友处理一个Python Qt5的程序,整体这个程序他们用户AI做了70%了,但是他们需要串联业务(把功能菜单通过tab切换、子窗口、stateWidget切换,业务调试等)就找到了我。好盆友嘛,吃了一个饭,发了我点零花钱,我就来帮忙了。那基本前期在windows下改代码、测试、打包都没问题了,最后,我朋友的朋友他们的工控设备使用centos7 桌面版,需要我把程序在这上面正常的跑起来。我听了:得加油。 然后,那边,准备好了虚拟机环境,这边我也开始。

过程

整个搭建qt环境的过程还是挺顺利的,我也是通过多个ai很快搞定

qt5 必要依赖

#启用 EPEL 仓库
sudo yum install -y epel-release
# Qt5 核心库及开发文件
sudo yum install -y qt5-qtbase-devel
# 其他
sudo yum install -y \
  openssl-devel \
  libX11-devel \
  libXext-devel \
  libXrender-devel \
  libXcomposite-devel \
  libXcursor-devel \
  libXi-devel \
  mesa-libGL-devel

朋友们,你们就根据这个来吧,有问题问ai,缺啥补啥

第一个坑-openssl 版本问题

之前在win py version 是 3.10以上。寻思用pyenv 搞个一样的,结果, 你妹子的,它们那个centos openssl 版本 1.1以下,死活升不上去,然后py 3.10以上又必须要openssl 1.1以上。
最后,我拖鞋,py 换成3.9,解决问题

第二个坑-运行入口文件无法启动程序

我以为环境是最坑的,没想到啊,启动这个报错才最tm 恶心了。报错内容:
gdk message python:fatal io error 2(no such or diretory on x server:0)
国内外的AI专家问完了,你猜怎么着,结果,AI没给我解决到问题。这 尼玛的,怎么办呢,好在AI还是给我了思路,让我写个hello world 看看,排除扩展问题。


接着我成功运行了hello world,然后顺着思路,我单独启动了一些视图文件,也可以。这下,我就感觉肯定是哪个代码有问题了,我开始断点测试,测了老半天,异常捕获始终没效果,尽管入口文件也有处理器,还是没有被日志记录到。那说明问题不在python,在qt。

   # 设置全局异常处理器
    sys.excepthook = global_exception_handler

当我把问题定位到qt里面,我才想到了,我最开始在网上搜到了一个在ubuntu 下 qt项目也报了和我这个类似的问题。峰回路转,我立马去仔细看他那个问题,根据它的描述,大致问题就是: setWindowIcon 这个在ubuntu下面使用就不行,那个技术朋友文章就屏蔽了这行代码解决问题。那我根据它的思路,也把python的这行代码注释后运行,奇迹发生,我的窗口活生生的出现在我眼前,好,问题解决。

       # 设置应用图标
        # 需要判断当前是否是mac和windows才能设置
        if sys.platform == "darwin" or sys.platform == "win32":
            icon_path = resource_path("images/logo.png")
            if os.path.exists(icon_path):
                self.setWindowIcon(QIcon(icon_path))
                logging.debug(f"加载应用图标: {icon_path}")
            else:
                logging.warning(f"图标文件不存在: {icon_path}")
        else:
            self.setWindowIconText("IASTest")

第三个坑-PyInstaller版本老

建议最好升级下

第四个坑-磁盘容量不够,导致打包不完整

这个我当时没截图,就大概说下吧,它们虚拟机主分区磁盘空间严重不足,我打了n次都不行,后面看到了桌面有提示,这下我才感觉到问题,于是,我又去清理空间,最后打包成功并且程序正常使用。我把打包指令放出来

# 查找 Qt5 插件路径(通常在虚拟环境或系统 Python 中)
python -c "from PyQt5 import QtCore; print(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PluginsPath))"

# 假设输出为 `/home/li/.pyenv/versions/3.9.22/lib/python3.9/site-packages/PyQt5/Qt5/plugins`,修改命令:
python -m PyInstaller --name="IASTest" \
                      --icon=resources/images/logo.png \
                      --add-data="resources:resources" \
                      --add-data="config:config" \
                      --add-data="db:db" \
                      --add-binary="/home/li/.pyenv/versions/3.9.22/lib/python3.9/site-packages/PyQt5/Qt5/plugins/*:qt5_plugins" \
                      --hidden-import=PyQt5.sip \
                      --hidden-import=sqlalchemy.sql.default_comparator \
                      --windowed \
                      --clean \
                      --noconfirm \
                      app.py

定义桌面应用程序快捷方式

在Linux系统中,.desktop文件是一种用于定义桌面应用程序快捷方式的特殊文件。对于CentOS用户来说,通过创建.desktop文件,可以轻松生成个性化的桌面启动器,从而方便地访问常用的应用程序。本文将详细介绍如何在CentOS系统中创建和使用.desktop文件。

了解 .desktop 文件

.desktop文件通常具有以下结构:

[Desktop Entry]
Name=应用程序名称
Comment=应用程序描述
Exec=应用程序执行命令
Icon=应用程序图标路径
Type=Application
Categories=应用程序类别
  • Name:应用程序的名称。
  • Comment:应用程序的描述。
  • Exec:执行应用程序的命令。
  • Icon:应用程序的图标路径。
  • Type:应用程序的类型,通常为Application。
  • Categories:应用程序的类别,用于桌面环境中的搜索和分类。

创建 .desktop 文件

这里我把python qt5 的项目编写到文件,其中Exec设置成我们打包后dist\项目下的可执行程序就行:

[Desktop Entry]
Name=IASTest
Comment=My PyInstaller Application
Exec=/home/li/iasTest/dist/IASTest/IASTest
Icon=/home/li/iasTest/dist/IASTest/logo.png
Terminal=false
Type=Application
Categories=Utility;Application;
StartupNotify=true
以下是各个字段的意义:

将 .desktop 文件放置在正确的位置

将创建的.desktop文件放置在以下目录之一:

  • /usr/share/applications/:适用于所有用户。
  • ~/.local/share/applications/:仅适用于当前用户。

更新

sudo update-desktop-database ~/.local/share/applications
sudo update-desktop-database /usr/share/applications

效果

image

第五个坑-找不到串口

你妹子的,眼看都搞定了。测试发现找不到串口,哎。通过ai,我们只需要关机在vm里面添加串口设备(如果不行,还需要执行指令的,自行ai了),看我下面的图就行
image

总结

坑太多,我只想说:感觉这些计算机巨老们,创造了 deepseek 、豆包、千问、claude、gpt

posted @ 2025-05-16 15:50  wanzij  阅读(55)  评论(0)    收藏  举报
TOP