在新的桌面软件中,高级语言获得了越来越多的应用,与C和C++语言相比,它们更是受到了人们的喜爱。Python是KDE/Qt中获得最佳支持的语言之一。为了解PyQt的过去与现在,KDE Dot News与其作者及维护者Phil Thompson进行了交谈。



请介绍一下您自己以及您在开源软件中的角色

通过我的公司Riverbank Computing,我开发并维护了一些相关的软件包,它们是SIP,PyQt和QScintilla。

SIP是一个与C和C++库相接的Python绑定发生器。开始的时候它是一个小的SWIG(这也是它名字的由来)并在1998年发布。当时我觉得 SWIG想要做成一个更具通用性的工具,在生成C++库的Python绑定方面做的并不好。所以SIP还需要更多特殊工作才行。

PyQt是Python是Qt库的Python绑定。PyQt3支持Qt1到Qt3。PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt遵从奇趣的许可模式,有GPL版和商业版。

QScintilla是一个Scintilla代码编辑器件面向Qt的接口。它支持Qt3和Qt4并包含了大量的Python绑定。首先是我编写了这个接口,于是Eric IDE(Detlev Offenbach的作品)才有了一个不错的程序编辑器。它也有GPL和商业两个版本的许可。

什么是PyQt,为什么我得使用它?

PyQt向Python程序员提供了使用完整Qt应用程序接口的方法。您几乎可以用Python做任何C++能做的事。

既然是应用程序接口,用C++或是Python都是一样的。于是“为什么我得使用它”这个问题就可以归结为编程语言的选择上,而不一定要用PyQt。对我来说作为一种编程语言,python相对于c++的优点是在编程效率上。您可以看到标准的Qt例子移植到PyQt后的代码。它们具有相同的功能,使用相同的应用程序接口,但Python版的代码只有原来的50-60%,而且它们更容易阅读。

与编程效率相关的是Python更容易学习,而且它足以满足富有经验的程序员。奇趣公司已经发现PyQt可以使他们向应用高端技术的团体出售Qt,这些团体的成员是工业专家(化学家,航空工程师等)而不是精深的C++程序员。

当然PyQt既成熟又稳定,并且有庞大的用户群体。我从用户那儿得到的两个最普通的反馈是“它恰到好处"和“它很不错。”

您为什么启动PyQt项目呢?

原因很普通。就像人身上有地方痒了就会去抓一样。我原先用Tcl和Tk开发提高个人生产率的工具,做了很多年。但我越来越发现Tk程序看起来实在太丑陋了(因为别的东西越来越漂亮),为此我感觉沮丧。我开始使用KDE1并转向Python,因为当时python已有了一些用SWIG做的最初的KDE绑定构架。我很快意识到我可以把它做的更好,于是就动手去做了。

0.1版发布于1998年11月1号,使用的是Qt1.41和KDE1.0,此后每三个月发布一个新版本。

绑定是怎么完成的?

先由SIP生成一系列.sip文件以描述应用程序接口,并生成需要的C++代码。随后编译它以产生Python扩展模块。一个.sip文件是基础的类的头文件,但有些被去除掉了(因为SIP不包括一个完整的C++分析器),有些被添加了(因为C++不一定能提供关于API如何工作的足够信息)。

PyQt成功的关键之一是它关注了.sip文件中的细节。我并不相信自动完成的绑定生成和结束具有工业强度。你可能自动完成95%的工作,但你必须根据特定的目标语言实现需要其它的一些信息。以Python为例,其重点是一个Python对象知道当它完成了内存垃圾回收后,它是否需要调用相应的C++事件的清除器。由程序本身管理这些是对付内存垃圾问题的良方。

在PyQt第三版中,.sip文件是累加的。它们从Qt 1.41版以来的最初生成慢慢丰富到现在的规模。SIP有一个版本系统,所以第三版的.sip文件包容了Qt应用程序接口从1.41版到3.3.6版的完整历史。虽然我没测试过它,但PyQt第三版应该仍然可以面向Qt第一版工作。

而PyQt第四版中我用了一个内置工具(当然也是用PyQt写的)叫做metasip。它算是SIP的一个IDE。metasip项目应用GCC-XML 来分析最新的头文件并以XML格式保存相关数据。metasip将新的API版本与当前版本相比较,标记所有需要关注的改变。那些改变通过GUI记录下来,并列入TODO表中。产生.sip文件其实只需用鼠标一点就行了。在我的次级仓库中,PyQt第四版主要只是一个20M大的XML文件。针对Qt4的小的发布变动而升级PyQt4,只要花大约半个小时的时间就可以完成了。

根据代码产生的机理,我不认为这与其它的绑定生成器工作有什么不同。Python有一个很好的C 应用程序接口以便编写扩展模块-这是为什么有这么多第三方工具使用python绑定的原因之一。对每个C++类,SIP都会生成代码,用C语言创建相应的Python类。

Python类的实现方法与C++相似。Python不支持过载功能,它会实时检查传递的变量参数的类型以确保信号的正确。

如果一个C++类包含虚拟函数,则SIP产生出一个C++子类重构它们并检查是否存在一个相应的Python重构。如果有的话它就会被调用,否则就会调用基础的执行工具。检查的结果会被放入缓存中,所以它不会是一个很大的开销。指向被保护的函数的话也会用这种生成子类的方式实现。


这与用SMOKE实现的绑定比较起来怎么样?

我不知道。我从没用过SMOKE或任何基于它的绑定。

PyQt3的完整性怎么样?

几年前它就完整了。新的发布只是用新版本的SIP对新版本的Qt的发布和基础构架的改变而做点相应的小更改。

我很早之前就认定不是我能决定Qt API的哪一部分才是应该出现在Python程序员面前的,所以我把它们都实现了。

针对Qt4的绑定目前完成的怎么样?

已经完整并相当稳定。PyQt第四版在6个月的快速开发后完成,并于6月10日发布了。PyQt 4.0.1版在7月15日放出,这是个小的维护版本。在绑定的本身一个小bug都没被举报过。

您对PyKDE有什么意见?

作为原作者,我认为pyKDE很美妙。目前的维护者Jim Bublitz在做一项比我做PyQt难的多的工作。KDE比Qt大多了,它的API也不够稳定,所以各发行版的有些工作像是在浪费时间。所以他就帮我改进SIP以让他能更好地分解KDE的API。Jim也是一个比我更好的人。

当在PyKDE4的开发中,我怀疑他所得到的帮助要比他所需的帮助要多的多。也许那些想更多地利用PyKDE的发行版会帮他加强这个板块的。

就您的工作,您与奇趣公司有哪些接触?

我们之间存在一个正在进行的非正式的关系已有5到6年了。几年前,他们盛情邀请我参加Oslo。观察他们的开发工作很有趣。最初他们专注于技术(当然现在还是如此),但缺乏一个强的发售/市场成绩。作为一个公司,他们没有“得到”PyQt,是因为他们不能理解为什么有人不想使用C++ -我怀疑他们的绝大多数程序员还是这么想。

最近他们的业绩加强了。他们知道了人们想要使用其它语言因为这是他们的顾客的要求。他们知道有很多团体购买Qt的原因是这些团体想要使用PyQt。

他们也在着力开发Qt生态系统:与开发补充技术的Riverbank公司合作开发程序。

这项工作的资金怎么来的?

PyQt有些利润- 资金是自己提供的。它不仅卖出许可,有时从销售中得到一点提成。如我每年花剩余的时间帮助一个顾客使他的团体能更好地利用PyQt。

目前你有多少商业用户?

当前有超过200个。

您能说出PyQt的一些令人兴奋的特殊用户吗?

一个“一人公司”在网上卖软件的一个不利的地方是你不能很好的搞清楚你的用户。不过作为一个影迷,我很高兴的发现迪斯尼、Dreamworks、Pixar、Industrial Light、Magic、索尼 Pictures等都是我的商业用户。

有多少人在为PyQt工作?

我是唯一一个为SIP和PyQt核心工作的人-除了其它人不时给我的补丁。而对于PyQt4,Torsten Marek编写了pyuic4。Ulli Berning给予我很大的帮助以确保PyQt能在HP-UX, AIXt 和 Solaris上构建并运行。

当然一个成功的项目不止一个人写代码的,很多人都为这个社区捐献了很多:Detlev和Jim我已在上面提过了, Boudewi jn的原作的book程序,提供PyQt4例子的团体,GerardV写了PyQwt,DavidB和AndreasP在邮件列表中贡献的质量控制。

Riverbank公司提供了什么呢?

PyQt技术的另外一个领域是嵌入式Linux系统-移值,硬件驱动等。我毕业后的第一份工作是做一个硬件工程师,我也喜欢可以为一个可以大展拳脚项目工作。

您希望看到更多的程序员使用高级语言吗?

是的-我认为这是必然的。在我小时候,对于在CP/M上用Z80汇编语言还是C语言来编程的问题常常引起争论。C语言占有太多的资源(别人跟我说的),但是我所有的C程序都比Z80汇编程序要强大,要稳定并能更快地编成。我看到很多关于C++语言与Python等的语言的争论与以前几乎一样。目前C++在编写框架时表现很好,但我不太喜欢用它来写应用程序。

您今年会参加Akademy大会吗?
不会,我恐怕太忙了
本站文章仅代表作者观点,本站仅传递信息,并不表示赞同或反对.转载本站点内容时请注明来自-Linux伊甸园。如不注明,将根据《互联网著作权行政保护办法》追究其相应法律责任。

--------------------next---------------------