级别: 初级 David Mertz, Ph.D (mertz@gnosis.cx), Reducing Agent, Gnosis Software, Inc.
2001 年 7 月 01 日 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。希望这种行为在以后的版本将会得到改善。
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,'\012')
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
'\nROW',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
精神所在:首先使之正确,然后再添砖加瓦。甚至……也许在不久的将来,即使再希望加些什么也不为过。
参考资料
关于作者
对本文的评价
|