在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

时间:2021-02-01 23:00:47

一、摘要

python-pyqt5 软件包是做什么的,我在Ubuntu 14.04 64bit上该如何安装呢?
pyqt5 python的GUI开发包。也就是跨平台的图形化开发包
http://www.riverbankcomputing.com/software/pyqt/download5
下载安装即可。安装的过程很漫长,繁杂,特将踩坑过程记录出来。另外,这可能是目前为止网上最好的一篇pyqt5的安装笔记,比其它同类安装过程都简洁。

二、简介

PyQt是Qt库在Python的绑定版本,PyQt为我们Python程序员提供了使用完整Qt应用程序接口,几乎可以用Python做任何C++能做的事。作为一种编程语言,python相对于c++的优点是在编程效率上。
PyQt(Python的GUI模块)既成熟又稳定,并且有庞大用户的群体,我从用户那儿得到的两个最普通的反馈是它恰到好处和它很简单易用。
PyQt 5.4.2版本最新发布了,Qt 库的Python绑定。这个版本已经完美的支持 Qt v5.2.1了,包括最新新的组件QtBluetooth、QtPositioning、QtMacExtras、QtWinExtras 和 Qt11Extras 模板等。
PyQt5支持Python v2.6, v2.7 and v3.

配置PyQt5之前,必须首先安装SIP。

SIP是C/C++绑定生成器,是一个自动为C和C++库生成Python扩展模块的工具。为了方便开发PyQt,SIP于1998被“Riverbank Computing”公司创造出来。不过,SIP不专用于PyQt,而是适用于所有的C和C++库。 使用SIP时,程序员首先要编写一个特殊的".sip"文件,使用类似于C++的语法在其中描述扩展模块所提供的类型与函数。然后用SIP将这个文件转化为C++代码。最终编译,与C、C++库链接后就成为Python扩展模块。".sip"文件类似于C、C++的头文件。根据需要,需要程序员用SIP定义的语法添加一些C++代码中没有的信息。因为SIP不支持完整的C++语法,所以不能直接使用C++的头文件作为".sip"文件。

三、安装

1.安装QT库(含QT4和QT5)

sudo apt-get install qt-sdk

下载的软件包很大
如果自己编译QT库,那就需要手动修改路径
cd /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/
会有一个default.conf配置文件,可以修改默认配置文件为你编译好的QT库路径

在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
2.安装SIP

从官网

http://www.riverbankcomputing.com/software/sip/download

下载最新稳定的tar.gz源码包,当前版本是sip-4.16.8.tar.gz,并解压

python configure.py
make sudo make install
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
安装完成后,立即查看sip版本 sip -V  在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

3.安装PyQt5

建议从官网

http://www.riverbankcomputing.com/software/pyqt/download5

下载源码包,不要从github上

https://github.com/baoboa/pyqt5

下载源码,因为编译有问题,参见遇到的问题4.

解压源码后,进入源码目录,运行

python configure.py --sip-incdir=/usr/include/python2.7

make -j4
sudo make install

编译过程很漫长,我的顶配ThinkPad T420温度飙到80+度,持续十多分钟。

在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)


在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

四、安装中遇到的问题 问题1
qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
出错原因,没有安装qt4库,执行
sudo apt-get install qt-sdk
问题2
Error: Make sure you have a working sip on your PATH or use the --sip argument to explicitly specify a working sip.
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
没有事先安装SIP,先去安装SIP吧
问题3
sipAPIQtCore.h:28:17: fatal error: sip.h: 没有那个文件或目录
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
没有指定sip.h所在路径,configure时使用python configure.py --sip-incdir=/usr/include/python2.7
参考链接
https://shenwang.blog.ustc.edu.cn/huhamhire-hosts/

问题4
qpyopengl_add_constants.o:在函数‘qpyopengl_add_constants(_object*)’中:
qpyopengl_add_constants.cpp:(.text+0x0): `qpyopengl_add_constants(_object*)'被多次定义
qpyopengl_add_constants.o:qpyopengl_add_constants.cpp:(.text+0x0):第一次在此定义
collect2: error: ld returned 1 exit status
make[1]: *** [libQtGui.so] 错误 1
make[1]:正在离开目录 `/home/taoyx/program_develop/pyqt5/QtGui'
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
仔细研究发现该QtGui目录下有两个同名文件并且实现代码完全相同, 不同之处仅是:
qpyopengl_add_constants.cpp,使用defined(SIP_FEATURE_PyQt_OpenGL)控制
qpyopengl_add_constants.c 没有使用宏控制
问题应该是禁用该宏才不会导致该问题
将qpygui.pro中的qpyopengl_add_constants.c注释掉,发现行不通,还有其它几种做法,折腾了一阵,还是搞不定,放弃了。经过网上资料 http://my.oschina.net/u/2306127/blog/370834
说,github上的版本编译不过去,改为从官网下载就ok了
五、编写demo验证
先验证PyQt4和PyQt5模块是否能成功加载?
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)
编写一个python脚本,然后使用python helloworld.py验证就可以了。
#!/usr/bin/env python
#encoding: utf-8

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('helloworld')
w.show()
sys.exit(app.exec_())

运行效果截图
在Ubuntu 14.04 64bit上安装python-pyqt5软件包(python 2.7)

六、参考文献

[1].http://blog.csdn.net/idber/article/details/40076821   相当有价值,这个里面也有例子[2].http://my.oschina.net/quanpower/blog/307140   后面的小demo验证相当有价值[3].http://my.oschina.net/jlan/blog/402669               hello world示例