在MacOS上安装PyQt5

今天借来了学生会实践部买来的NFC射频读卡器,在我的Windows本上刷校园卡玩了玩。据PKU OSA群里的小伙伴说,有人拆开北大校园卡发现使用的是ISO14443,这一点有待确认(然而我实在心疼我的卡,暂时先不动它了)。

因为计划在寒假里完成的项目有一个就是做一个“北大校园卡打卡器”,所以需要学习一下PC/SC相关的API. 在网上能检索到的教程并不多,大概过了一遍几个比较流行的Wrapper,直观上感觉由Python封装的pyscard应当是其中比较适合我来使用的。当然具体的学习实践统统要丢到假期里完成,最近真的要好好复习,否则Die…(咦这句话怎么耳熟)

这个项目目前看起来要实现的最主要部分就是PC平台的客户端(PC/SC也有Android支持,然而一来成熟的库很少,二来感觉产品成熟之前还不需要迁移到移动平台),为了能让使用者的体验稍微好一点,我们需要完成一个GUI.

目前Python最流行的GUI编写应当就是PyQt了,是Qt库的Python版本。对于无比强大的跨平台库Qt也是早有耳闻,不过还一直没有真正接触。正好假期的计划里很可能会用到,正好就把开发环境配置一下。

零、准备工作

我下载的版本为PyQt5.5.1,除了Linux和MacOS之外你也可以在这里找到Windows上的安装包。

在安装PyQt5之前,你需要准备:

  • Xcode
  • Qt,我使用的是Qt5.5.1 Open Source版,Qt官网的下载比较慢,可以去北理工的镜像地址下载。
  • SIP,下载地址,我使用的版本为sip-4.17
  • PyQt5,下载地址,我使用的版本为PyQt-gpl-5.5.1

安装Xcode是因为我们需要gcc来编译PyQt,而Xcode内置gcc. 如果你从其他途径安装了gcc可以跳过此步。

Qt,也就是这个著名的C++ GUI库,上面给出了可用的镜像,网速够快的话直接去官网下载也可以。

SIP,是将C++库绑定到Python的工具。

为了方便后续的操作,可以在Users/[User Name]/下新建一个pyqt-install文件夹,并把sip-4.17.tar.gz和PyQt-gpl-5.5.1.tar.gz复制在该目录下解压。

一、安装

(1.0) 安装Qt
直接运行下载下来的dmg即可。
可以在.bash_profile下设置一下PATH以方便后续操作。
在文末加入形如:

1
2
PATH="/Users/LuoLiangchen/Library/Qt5.5.1/5.5/clang_64/bin:${PATH}"
export PATH

(1.1) 编译SIP
打开Terminal,把当前目录设为sip-4.17

1
$ cd pyqt-install/sip-4.17

配置:

1
$ python3 configure.py

完成后进行编译:

1
$ make

编译结束后安装:

1
$ make install

(1.2) 编译PyQt5
过程基本与前面类似

1
$ cd ../PyQt-gpl-5.5.1

配置:

1
$ python3 configure.py

期间会遇到询问你是否接受LGPL协议

1
...
Do you accept the terms of the license?

回答yes继续

编译:

1
$ make

这一次会编译比较久

等待编译完成后安装:

1
$ make install

至此安装结束~

二、测试安装结果

你可以利用PyQt里的examples测试安装结果,不同的PyQt版本examples的路径可能不同,请注意按照你安装的版本来

1
$ cd examples/qtdemo
$ python3 qtdemo.py

如果弹出一个Qt Examples窗口则以上安装成功。

qtdemo

三、安装中可能遇到的问题

(3.0) PyQt5和Qt的协议不匹配
在配置PyQt5时可能出现如下问题:

1
Error: This version of PyQt5 and the commercial version of Qt have incompatible licenses.

错误原因是Qt的版本是商业版本,而PyQt5是开源版本的。
这个错误蛮诡异因为下载Qt是我也选择的是开源版本,目测是Qt给的离线版本只有商业版。所以如果网速可以的话可以用Qt的在线版本下载,应该可以避免这个问题。

不过这个错误还是可以处理一下的。我们打开PyQt5下的configure.py,查找刚刚的错误message:This version of PyQt5 and the commercial…
检索到如下代码:

1
2
3
4
if introspecting and target_config.qt_licensee not in OPEN_SOURCE_LICENSEES and ltype == 'GPL':
error(
"This version of PyQt5 and the commercial version of Qt have "
"incompatible licenses.")

大概能猜出这里就是判断Qt是否是开源版本的语句,我们直接把它注释掉,重新运行

1
$ python3 configure.py

成功!
『当然,这个方法有点违背开源精神…不过这个锅得甩给Qt,自己说好的开源版本给了商业版的链接算什么嘛』

(3.1) 缺少qgeolocation.h
在执行make编译中,出现如下错误

1
/Users/LuoLiangchen/pyqt-install/sip-4.17/QtPositioning/qgeolocation.sip:28:10:
                             fatal >error: 'qgeolocation.h' file not found
 #include <qgeolocation.h>
           ^
 1 error generated.
 make[1]: *** [sipQtPositioningcmodule.o] Error 1
 make: *** [sub-QtPositioning-make_first-ordered] Error 2

缺少头文件这个真是有点蛋疼。
PyQt包少东西…
去StackOverflow查了一下,果然也有人掉了这个坑。

解决方案是在/PyQt-gpl-5.5.1/QtPositioning/下自己新建一下qgeolocation.h,然后去这里把代码复制粘贴在头文件里。

保存,重新运行

1
$ make

再次等了很久,没有Error了!