David Mertz, Ph.D ( [email protected] )
Reducing Agent, Gnosis Software, Inc.
> Pippy 是移植到 PalmOS 的 Python 子集。使用 Pippy,Python 程序员创建在 Palm 设备上运行的定制应用程序,以及直接将 Pippy 用作 Palm 上的交互环境。David 评估了 Pippy 作为实现 Palm 应用程序的一种方式所具有的优越性与局限性。
让我以 Pippy 好消息和坏消息的笑话方式来介绍它。关于 Pippy 的好消息是 Python 程序员可以完全在 Palm 上编写和运行程序。而且,对于版本 0.7,Pippy 变得更快、更稳定以及更易于使用。坏消息是,到目前为止,Pippy 仍然是相当“前沿”的软件,并且程序员在开发环境中希望的许多功能,计划在以后的版本中,现在还没有。尽管如此,现在 Pippy 已经提供了足够使用的功能,可以使您不费太多力气就能完成有用的事。
安装 Pippy
安装 Pippy 时,首先下载其可执行和/或源档案。源档案是 tar 包,称为 pippy-0.7-src.tar.gz ,而只有可执行文件的分发版称为 pippy_0_7.zip (或相同文件名,但扩展名是 .tar.gz 、 .sit 或 hqx ,取决于平台)。对大多数用户,用可执行文件的分发版是最容易的。首先让我们看一下该分发版。
在 Pippy 可执行档案中,会发现称为 ./pippy_0_7 的相对目录。在这个目录里有五个文件。阅读 README - 和以往一样 -然后查看 LICENSE 和 NEWS 文件以了解期望的主题。找到 pippy.prc 和 pylib.prc 文件。这些是将要上载到 PalmOS 设备的文件。
如何将这两个文件上载到手持设备上,根据运行的桌面操作系统的不同而不同。而且,已经将任何附加应用程序安装到 PalmOS 手持的用户会熟悉这个上载过程。在 Windows 和 MacOS 环境下,通常用 "Palm Desktop" 及其 "Install" 按钮。在 Linux 或其它类 UNIX 平台或 OS/2 环境下,可能要用到 pilot-link 实用程序 - 尤其是 pilot-xfer 程序。这看起来可能如:
清单 1. 将 Pippy 和 PythonLib 传送到 Palm
$ pilot-xfer /dev/cua1 -i pippy.prc
$ pilot-xfer /dev/cua1 -i pylib.prc
一旦这两个 PRC 文件是在 PalmOS 手持设备上,所需要做的是运行 Pippy (我喜欢将其移至 "Programming" 应用程序类别,但这是一个小小的便利之处)。
编译 Pippy 的工作量要比仅下载可执行文件多许多。可以在两种编程环境下构建 Pippy。一种涉及在机器上安装 PRC-Tool 和 Python 1.5.2(正是那个版本)。安装 PRC-Tool 本身是一项复杂的工作,需要找出库和编译器相关性以及查找每一样的正确版本。本文没有涵盖进行那类工作的所有细节。
对于 Win32 和 MacOS 环境,编译 Pippy 可能容易些。首先,需要花点钱购买 CodeWarrior。其次,需要下载并且成功地安装自由工具 Cygwin、PilRC 以及 Python 1.5.2(Python 更高版本可能也行)。虽然这种方法的工作量可能要比用 PRC-Tool 方法的少,但除非您的系统碰巧满足了所有先决条件,自己编译 Pippy 的方法也不是毫无痛苦的。
如果设法从源文件构建 Pippy,则您可以选择将其编译进自己的 Python 扩展模块,并且可能以缺省方式将它们导入。对于本文,仅假定您正在使用 Pippy 分发的可执行文件版本。幸运的是,自版本 0.7 起,在预编译环境中运行定制代码相当容易。
使用 Pippy
Pippy 是一种交互式环境,类似于 Python 交互式外壳程序,但更归功于另一种称作 LispMe 的 PalmOS 语言/环境(请参阅本文后面的 参考资料 )。迄今为止,Pippy 只不过 是这个交互式环境,而并非是创建独立应用程序的方式(除非您想比我更进一步研究该源码)。但这已足够创造一个好的开始。让我们来看一下它是怎样的:
图 1. 运行 Pippy 的 PalmOS 手持设备
使用 Pippy 涉及输入 Python 命令。该图说明了这一点,但还可以创建更大规模的构造,如函数定义和类。
在交互式环境中有一件事情值得注意,当写完每个语句组,需要 eval 它。很遗憾,这可能使人有点迷惑,因为在交互式环境中有些语句可能会被忽略。例如,如果输入以下语句,然后按下 eval ,可能几乎确实期望看到打印 "4":
图 2. 同时有多条语句的 Pippy 会话
清单 2. 同时有多条语句的 Pippy 会话
x = 3
x = 4
print x
相反,实际发生的是没有打印任何值,而且 x 还是等于 3。希望这种行为在以后的版本将会得到改善。
Pippy 使用存储的程序
幸运的是,除了简单地将语句输入交互式环境,还有更实际、更有用的方式来使用 Pippy。使用 "Memo Pad" 应用程序存储希望以后运行的 Python 程序。创建一个称作 "Python" (大小写很重要)的 Memo Pad 类型,然后将 Python 程序作为便笺存储起来。需要遵循的一条规则是,每条便笺应该以 # 号开始,后面跟将实现的 Python 脚本/模块的名称。例如,下面是我编写的一段简单程序(完全是在 Palm 上,没有接触台式计算机):
清单 3. 在 Palm 上编写的简单 Python 程序
#go2.py
**def** **go** (data):
**from** string **import** split
add= **lambda** i,j: i+j
lines=split(data,'12')
rows=[]
**for** line **in** lines:
fs=split(line)
**for** i **in** range(len(fs)):
fs[i]=int(fs[i])
**if** fs: rows.append(fs)
**print** 'Records:',len(rows)
**print** '-----------------',
i=1
**for** row **in** rows:
**print** 'ROW',i,
cnt=len(row)
**print** ' -count:',cnt,
tot=reduce(add,row)
**print** ' -tot:',tot,
avg=tot/cnt
**print** ' -avg:',avg,
i=i+1
您可能注意到,我使用较短的变量名,并且保持代码行简短。我发现,当在 Palm 屏幕上折行时,由于难以辨认哪行是因显示而折行,哪行是因程序结构而折行,所以使人感到迷惑。基本上,这是一个完全正常的(虽然简单和无聊)Python 程序。让我们看一下使用该程序的交互式会话。
清单 4. 使用便笺导入的 Pippy 交互式会话
Python 1.5.2+ (#1, Jun 11 2001, 15:41:50) [GCC 2.95.2-kgpd 19991024 (release)]
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
import memoimp; memoimp.install()
from go2 import go
from data import data
go(data)
Records: 4
-----------------
ROW 1 -count: 5 -tot: 288 -avg: 57
ROW 2 -count: 4 -tot: 193 -avg: 48
ROW 3 -count: 7 -tot: 64 -avg: 9
ROW 4 -count: 4 -tot: 398 -avg: 99
from data2 import data
go(data)
Records: 2
-----------------
ROW 1 -count: 4 -tot: 173 -avg: 43
ROW 2 -count: 8 -tot: 45 -avg: 5
请特别注意第一行,在从 Memo Pad 导入之前,需要导入 memoimp 模块,并运行其 .install() 方法。我认为开发人员应该使这成为以后版本的缺省值,但同时,将第一行放在剪贴板是很方便的(在便笺中将它复制到那儿也很容易)。
为完整起见,让我们来看一下这些“data”模块之一可能会是怎样的:
图 3. Memo Pad 数据文件模块
很容易想象这个小便笺可以用来收集某些种类的字段数据,对于这些数据来说,手持设备是相当理想的:在鸟类研究中计算鸟的分布;计算每个仓库陈列架的零部件数;等等。您也可以很方便地为数据添加更多结构和格式,并相应对该结构进行语法分析。该示例仅产生了一些非常简单的统计数据。
称它为测试版的原因
正如我在本文开头所写,Pippy 仍处于前沿位置。稳定性是很好,但 Pippy 缺乏一些非常基本的特性。所有事情都需要有时间。
聪明的读者首先会注意到,我的样本应用程序通过一些不常见的、过于复杂的方法来获取其输入数据。为什么不建立 input() 或 raw_input() 循环,并在那里收集数据 - 也许用每一项来处理它?PalmOS 没有文件概念;特别,它没有 STDIN、STDOUT 或 STDERR 概念。 print 语句不会真正输出到 STDOUT,而是到特殊的控制台。那儿根本就没有交互式输入。
有一名开发人员曾经向我建议,从 Pippy 调用定制表单是 可能的 ,这里这些表单本身是由其它开发系统创建。这种方式使用表单非常转弯抹角,而且不管怎样还没有编制成文档。在未来版本希望会有所改善- 也许有 STDIN 和 STDERR 的仿真,或者可以方便地产生 Pippy 特定的 Palm GUI 表单的工具。但是,到目前为止,Pippy 对于批处理最实用(使我想起早期使用 IBM 360 穿孔卡片机队列的经历 -回顾历史总是令人愉快的)。
除了交互式输入以外,许多模块和功能仍处于规划阶段。这其中最重要的可能是浮点数!遗憾的是,这一相当重要的基本类型仍然停留在画板上。也许这与 Dragonball 处理器的浮点体系结构有关系。这仅仅是猜想。我也许错了。
十分重要的是缺少各种模块。没有 re ,这可能是很好的一个。也没有 os 模块,但对于这一个可能有许多好的理由。还缺少其它一些十分标准的模块。
另外,Pippy 的开发人员还有一些其它的目标。将 Pippy 更新至最新版本的 Python会很好 -特别是要包括简明扼要的列表(list)理解。此外,Pippy 开发人员希望将 Christian Tismer 的 Stackless Python 补丁程序包括在 Pippy 中。这应当极大地提高 PalmOS 硬件的性能(这会是很酷的)。
结束语
本文的最后一部分不加掩饰地指出了 Pippy 0.7 一些相当严重的局限性。有人可能会视之为檄文,但这并不是我的初衷。我发现 Pippy 是我所见过的最令人激动的 Python 项目之一。虽然 Pippy 也不是十全十美的,但它的确正在朝正确的方向前进。中间版本(如 0.7)是很稳定的,并且正在迅速地改进。还遗留一些东西 -所以 是 测试版 -但是,那些吸取进去的是经过了仔细考虑和良好实现的。这就是 Python 精神所在:首先使之正确,然后再添砖加瓦。甚至……也许在不久的将来,即使再希望加些什么也不为过。
参考资料
请访问 Pippy 的主页 并 下载 Pippy 。
PRC-Tool 是构建 C/C++ PalmOS 应用程序的 Linux(以及其它操作系统)方式。它包含一组针对 Palm 的 68k (Dragonball) CPU 以及硬件环境的相关自由软件工具。可以从 PRC-Tool 主页 安装 PRC-Tool。
如果使用 Win32 或 MacOS 机器,至少可以说, Metrowerks CodeWarrior for Palm OS Platform 是用于 PalmOS 开发的极佳 IDE 和编译器。CodeWarrior 是用来开发 PalmOS 相当“标准”的开发工具;例如,它是 Palm Computing 用来开发该操作系统的工具。CodeWarrior 是商业化产品,而且可能需要花钱来获得它(金额数目取决于许可证细节)。
可用于 PalmOS 的另一种语言,提供了 Pippy 交互式界面的灵感。请查看 LispMe 。
请阅读 developerWorks 上 “可爱的 Python:Python 实现内幕” ,其中 David 就 Stackless Python 与 Christian Tismer 进行了交谈。
请浏览 developerWorks 上 更多 Linux 资源 。
请浏览 developerWorks 上 更多开放源码资源 。
David Mertz 喜欢写一些受读者欢迎的边缘计算机技术。可以通过