【Ubuntu+python2】编译并运行PyQt5程序

2023-11-19

前言

老规矩,先来个前言。最近用python3和pyqt5写了个程序,考虑到和其他同事要开发环境一致,需要将程序运行环境切换成python2。但直接用python2肯定是跑不通的,因为pyqt5不支持python2……查了下只能对pyqt5源码重新编译。过程也满满都是坑……废话少说,直接上操作。


一、环境搭建

1、下载sip和PyQt5

本机运行环境:Ubuntu18.04、Python2.7

如果说你的系统默认调用的是python3的话,那记得先切回python2.7

另外需要下载sip和PyQt5的源码包,我用的版本为:
sip-4.19.8
PyQt5-5.10.1
上面两个都是官网链接。这里推荐直接去官网下载,照网上其他人说的好像github的编译会出问题,因此我就没尝试。

说明:sip是RiverBank(也就是PyQt的开发商)开发的用于PyQt的Python/C++混合编程解决方案。由于Qt框架的复杂性,PyQt并没有使用Cython、SWIG的混合编程方案,而是自己单独做了一套框架。如果PyQt想正常运行,sip的版本和PyQt5的版本必须对应上,但是他们之间的版本在字面上并没有什么关联性,也就是你根本不知道你这个PyQt5对用的sip版本是什么,这个可是坑了我特别久,可以说在编译过程产生的所有问题都是因为版本不匹配导致的,并且无论是官方还是民间都没有给出两者匹配的版本说明。。


这里也提供下其他版本的下载地址,欢迎尝试:
sip各个版本的下载链接
PyQt5各个版本的下载链接
我前前后后试了N个版本,最后只有两个可行:

PyQt版本 sip版本
5.10.1 4.19.8
5.11.3 4.19.14

2、移除本机自带sip

先查看有没有sip,防止后续安装失败:

ls /usr/lib/python2.7/dist-packages/sip*

在这里插入图片描述
如果有的话,直接sudo rm删除:

sudo rm -rf /usr/lib/python2.7/dist-packages/sip*

在这里插入图片描述

二、解压编译

1、sip解压编译

进入sip下载好的路径,打开终端,执行下面指令,一般sip的编译不会出现啥报错。

tar -xzvf sip-4.19.8.tar.gz
cd sip-4.19.8
python configure.py
make
sudo make install

查看是否安装上了,两者输出版本号即可

sip -V #终端查看sip版本
python #进入python命令行查看
import sip
print(sip.SIP_VERSION_STR)

在这里插入图片描述

2、PyQt5解压编译

同理,进入下载目录打开终端执行:

tar -xzvf PyQt5_gpl-5.10.1.tar.gz
cd PyQt5_gpl-5.10.1
python configure.py --sip-incdir=/usr/include/python2.7
# 根据提示输入yes回车,在这里如果版本不匹配会提示出错
make -j4 #这里会报错,解决方法在下面
sudo make install

make -j4编译过程出现报错error: ‘waitForEvents’ is not a member of ‘QTest’

在这里插入图片描述

这个函数自从5.10 / 5.11版本之后,去掉了。所以这里找不到,简单的办法就是按照提示找到调用该函数的地方,将其注释掉。
这个函数不重要,只有一个地方调用了,所以直接注释掉就OK了。就像这样在前面加两个斜杠
如果出现其他错误,不用怀疑,就是版本不匹配导致的!!!

测试

进入python命令行导入PyQt5库

python
import PyQt5 #没报错,ok

将原程序更换成python2运行,将第一行的

#!/usr/bin/env python3换成python2

在这里插入图片描述

报错1:ImportError: No module named sip

这种是版本不匹配,编译的时候没报错通过了,但是运行就不行了。PyQt5调用不到sip库导致的。

报错2:Segmentation fault (core dumped)

还是版本不匹配。

报错3:出现TypeError: super() takes at least 1 argument (0 given)

原因是super().init()函数在python3中支持,是正确的,但是放到python2中会出现问题;
如果在python2想要继承父类的构造方法,则需要给super参数中传入参数:super(base_model,self).init();

原代码:

class MyWin(QWidget):
    def __init__(self):
        super(self).__init__()

很简单,给super里传入类名即可:

class MyWin(QWidget):
    def __init__(self):
        super(MyWin,self).__init__()

成功
在这里插入图片描述


本文参考链接:
CSDN博主@雪峰流云
CSDN博主@爱发呆de白菜头
知乎:同时安装PyQt4和PyQt5之sip版本区分

欢迎补充,有错误请指正,有用请点个赞吧~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Ubuntu+python2】编译并运行PyQt5程序 的相关文章

随机推荐

  • <Linux开发>linux开发工具- 之-开发使用linux命令记录

    Linux开发 linux开发工具 之 开发使用linux命令记录 本文章主要记录开发过程中涉及使用的linux命令 1 查看磁盘大小分区情况 命令 df hl 可查看分区的路径 及空间大小使用情况 以及挂在点位置 2 查看指定目录文件的大
  • unity点击按钮,弹出image和Text做的弹出框

    让弹出框开始不显示 点击按钮后显示 在Hierarchy面板上新建Image 下面我命名为win 再在上面放置Image和Text组成弹出框 如下图 建立一个Message脚本 using System Collections using
  • [毕业设计]C++程序类内聚度的计算与存储

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • PLSQL 基础语法

    01 PLSQL 语法 变量 if loop cursor exception 1 语法 在数据库服务器上保存的打断可执行方法 供其他开发人员调用 可以有效的减少数据库端和服务端的数据交互 提高效率 降低带宽消耗 语法格式 declare
  • 网络工程毕业设计题目100例

    文章目录 0 简介 1 如何选题 2 最新网络工程选题 2 1 Java web SSM 系统 2 2 大数据方向 2 3 人工智能方向 2 4 其他方向 4 最后 0 简介 丹成学长 搜集分享最新的网络工程专业毕设毕设选题 难度适中 适合
  • Microsemi Libero系列教程(七)——SmartDebug的使用

    SmartDebug简介 SmartDebug的使用 ActiveProbe使用
  • VMware无法创建共享文件夹

    1 Linux安装VM 1 chmod x VMware Workstation Full 14 1 3 9474260 x86 64 1 bundle 赋予执行权限 2 VMware Workstation Full 14 1 3 947
  • 二面字节被问到VARCHAR(M) 到底占用多少个字节?我跟面试官硬刚了半小时

    前言 这个问题其实很有迷惑性 问的是字节 不是字符 我们知道在计算机中只能存储二进制数据 所以要搞清楚这个问题 就要搞清楚下面2个问题 1 字节和字符的对应关系 2 varchar 到底能存多少个字节 为了搞清楚上面两个问题 又必须搞清楚m
  • jenkins中使用git遇到的坑

    error src refspec master does not match any root c32e20fd20e8 var jenkins home workspace DataPlatform git push u DataPla
  • RK3568 Android12 RK628编译报错问题

    Platform RK3568 OS Android 12 Kernel v4 19 206 SDK Version android 12 0 mid rkr1 问题 在dts中配置rk628时遇到编译报错 提示找不到rk628的label
  • Kubernets原理分解

    主节点 master 快速介绍 master也要装kubelet和kubeproxy 前端访问 UI CLI kube apiserver scheduler controller manager etcd kubelet kubeprox
  • 高考失利,还适合选计算机专业吗??

    前言 高考落榜 人生陷入低谷 对于很多人来说 这意味着梦想的破灭和无尽的绝望 但是 对于我来说 这只是人生旅程的一个起点 我喜欢编程也热爱编程 虽然网上很多言论说计算机行业已经很卷了 但是我却认为无论再哪个行业 你不卷 也同样落后于人 所以
  • 微信小程序中上传图片添加水印功能

    功能实现 参考文章 https blog csdn net yynikki article details 101763718 遇到的问题 实现过程中主要遇到的问题有以下两个 1 在微信开发者工具上图片显示完全正常 但在真机上生成的图片不全
  • 理解一维卷积

    根据我个人的经验和偏好 理解数学概念的最好方式之一就是赋予其物理意义 把f t 看做输入 g t 看做系统的衰减系数 卷积就比较好理解了 在某一时刻n 该系统对f n 的响应值就是f n xg 0 但系统的总输出C n 不仅跟当前输入的f
  • HackBar 使用教程

    啥是Hackbar Hackbar是一个Firefox的插件 它的功能类似于地址栏 但是它里面的数据不受服务器的相应触发的重定向等其它变化的影响 有网址的载入于访问 联合查询 各种编码 数据加密功能 这个Hackbar可以帮助你在测试SQL
  • Pytorch环境配置——cuda、、cudnn、torch、torchvision对应版本(最全)及安装方法

    Pytorch环境配置 cuda cudnn torch torchvision对应版本 最全 及安装方法 一 查询可支持的最高cuda版本 二 查看cuda cudnn pytorch torchvision对应版本 三 安装 3 1 W
  • Python蓝桥杯 基础练习 十六进制转八进制

    def huan n n format int n 16 o print n x int input for i in range 1 x 1 n input huan n format o 将数据格式化为八进制 int n 16 返回字符
  • 攻防世界 pwn cgfsb writeup

    攻防世界pwn cgfsb 这一题是关于格式化字符串漏洞的题 是一个单一漏洞题 不需要太多的绕过 拿到题目首先查看一下保护 可以看到 这是一个32位的程序 并且开启了Canary保护和NX保护 我们看一下IDA 进入IDA 按下F5可以得到
  • 字节跳动最爱考的前端面试题:CSS 基础

    注意 每道题前面出现的 xx 数字代表这道题出现的频次 此 CSS 基础是基于 30 篇前端面经整理出的问题和对应的回答 参考链接等 文章内容为拿到 Offer 的本人整理 2 写代码 css div 垂直水平居中 并完成 div 高度永远
  • 【Ubuntu+python2】编译并运行PyQt5程序

    文章目录 前言 一 环境搭建 1 下载sip和PyQt5 2 移除本机自带sip 二 解压编译 1 sip解压编译 2 PyQt5解压编译 make j4编译过程出现报错error waitForEvents is not a member