用 Eclipse 和 Ant 进行 Python 开发(1..

用 Eclipse IDE 和 Apache Ant 构建工具进行 Python 开发

从 Java 技术 或 Microsoft.NET 刚刚转到 Python 的人会发现,功能丰富而精致的 IDE 和开发工具都不见了。那些开发人员可以从他们熟悉的 Java 开发工具中找到解决方案。本文着重介绍了如何使用基于 Java 技术的流行开发工具 Eclipse 和 Ant 进行 Python 开发。

PyDev 和 PyAntTasks 分别是 Eclipse 和 Ant 的扩展,有了它们就可能用这些 Java 工具开发 Python。本文从下载安装所需的工具与扩展开始讲起。为了解释如何在 Python 开发中使用 Eclipse 和 Ant,我将用实际的 Python 代码例子读取 RSS 资源。

Python 支持情况
本文用到的软件都在 CPython 2.3 下测试过。除了几个异常情况之外,应该也能在 Jython 中运行。特别需要指出,PyDev 调试器目前不支持 Jython。另一个区别是通过 Jython 执行的脚本在从 PyDev 中运行之后就转入交互模式,这样就必须手动杀死。PyDev 编辑器与 Jython 的源代码兼容,Python Ant 任务除 py-doc 任务之外也和 Jython 兼容。

使用 Eclipse 进行 Python 开发

Eclipse 是一个 Java 技术集成开发环境,由 IBM 开发,并开放其源代码。它是 IBM 商业软件 WebSphere Application Development 环境以及其他多种工具的基础。

尽管从传统上讲 Eclipse 是一种 Java 开发工具,但是一些插件的存在使得在 Eclipse 中开发其他语言的程序成为可能,如 C/C++、Python 和 Perl。

Eclipse 中,源代码被组织到项目(project)中。项目可以加载、卸载和导入。Eclipse 用户界面的结构划分为视图(View)与编辑器(Editor)。视图与编辑器的例子包括:源代码大纲视图、Java 源代码编辑器、Python 源代码编辑器和文件系统导航视图。Eclipse 用户界面中最关键的隐含概念就是 视角(perspective。视角是通常在执行某种类型活动时一起使用的一组视图。Eclipse 中的标准视角包括:DebugJava BrowsingJavaJava Type HierarchyPlug-in DevelopmentCVS Repository ExploringResource Install/Update。目前还不存在单独的 Python 视角。在进行 Python 开发时,我通常使用 Resource 视角和 Debug 视角。

安装 PyDev

从 Eclipse 中选择 Help > Software Updates > Update Manager,启动 Install/Update 视角。在左下角的 Feature Updates 视图中,将 PyDev 插件更新站点作为新的 Site Bookmark 添加到“Sites to Visit”文件夹下。Eclipse 的 PyDev 更新站点 URL 为 http://pydev.sf.net/updates/。现在,Feature Updates 编辑器中应该显示出“PyDev”这一特性。在 Feature Updates 编辑器中,展开 PyDev > Other,选择其中显示的 PyDev 特性(至少应该是 0.4.1)。然后选择 “Install Now”安装该特性。Eclipse 将下载 PyDev 插件,并将其安装到 Eclipse 中。

导入样例项目

为访问本项目中使用的样例代码,可先下载 zip 文件,在文件系统中展开该 zip 文件,然后将其中的项目导入 Eclipse。导入项目的方法是先切换到 Resource 视角,选择 File > Import,再选择“Existing Project into Workspace”,然后选择您展开 zip 文件的位置。这时,Navigator 视图中应该出现 feedParserTest 项目。
样例项目中已经包含了 Fead Parser 通用资源解析库,该库按 Python 开放源代码许可协议发布。

PyDev 漫游
现在开始学习如何通过已导入的项目了解 PyDev 的特性。PyDev 正处于开发过程中,但已经是非常高效的 Python 开发环境。现在的 PyDev 主要包括以下特性:
包含 Python 语法高亮显示特性的 Python 编辑器。进行 Python 语法分析,并在 Python 编辑器和 Tasks 视图中高亮显示错误。可将制表符转换成空格的选项。Outline 视图显示导入的库、类以及函数。终端视图中的 Python 堆栈跟踪信息可超链接到源代码中。源代码内部的超链接;同一模块内的导入和函数调用可通过超链接进行导航。从 Navigator 视图中运行 Python 脚本的能力。调试器支持断点、代码单步执行以及显示变量的值。

PyDev 选项窗口
通过 Window > Preferences,并选择 PyDev,便可访问 PyDev 选项。第一组选项可以改变 PyDev 在源代码中处理制表符的方式,还可以改变语法元素的颜色。

设置 Python 解释器
PyDev Debug 选项可以选择 Python 解释器,供执行 Python 代码时使用。如果 PyDev 无法找到 Python 解释器,或者想使用别的解释器,可在此设置。

处理源代码
我的大部分 Python 工作都是在 Resource 视角中完成的。使用方法是先切换到 Resource 视角,然后在左上角的 Navigator 视图中双击 feedParserTest/src/feedparserTest/FeedparserTest.py 文件。Python 编辑器打开该文件,对 Python 语法进行解析,完成设置颜色和语法检查的工作。

Python 编辑器

如果源代码中有任何错误,则显示在右下角的 Tasks 视图中显示出来。双击 Tasks 视图中的错误,便可找到那条讨厌的代码行。
Outline 视图在左下角,其中用一种便于浏览的结构显示出当前正在编辑的文件。导入的库、类、函数全都显示出来,通过双击 Outline 视图中的项目,便可以实现导航。PyDev 在编辑 Python 文件的过程中对齐进行预先解析的工作,同时更新 Outline 视图,执行语法检查,并用不同颜色显示语法元素。
编辑器的特性
PyDev 0.4 版在 Python 源代码编辑器中为函数和导入库加入了超链接的特性。如果在越过某项导入或函数调用(必须在 PYTHONPATH 目录中)的同时按下 Control 键,PyDev 就能显示出一个超链接,这样您可以在导入库或函数的源代码之间导航。请注意,为了在您自己的源代码中跨模块使用该特性(从一个模块链接到另一个模块),必须修改 PYTHONPATH 环境变量,在其中加入这些模块,这样 PyDev 就可以找到它们了。
人们已经开始将一些优异的源代码编辑特性加入最新版本的 PyDev 中,其中就包括代码块注释与取消注释,以及代码左右移位。

运行 Python 脚本
如果不能执行代码,那么 IDE 也不是太有用。为执行 Python 代码,可从 Navigator 视图中选择 feedparser.py 文件,用右键点击,然后选择 Python > Run。随后会显示 Python 的启动配置窗口。

Python 启动配置

Python 启动配置窗口中可以定义脚本执行的当前目录,传递给脚本的参数,以及用哪一个 Python 解释器运行脚本。feedparser.py 以一个 RSS URL 作为参数,所以可在参数字段中填入 URL,如 http://www.ibm.com/developerworks/news/dw_dwtp.rss。其余的缺省定义就可以了,所以单击 Run
脚本执行时输出信息显示在 Console 窗口中。如果有错误出现,Console 窗口中将显示堆栈跟踪信息,其中的每一行都可以通过超链接找到 Python 源代码。

Python 调试器
Python 调试器是最近才加入 PyDev 插件中的。要使用调试器,可在 Python 编辑器中想中断的代码行的左侧点击,设置断点。我在 feedparser.py 的 1830 行处设置了断点。然后在 Navigator 视图中选择这个 Python 模块,点击右键,选择“Python > Debug...”。这时将显示与前面相似的一个启动配置窗口。点击 Debug 进入 Debug 视角,同时启动调试器。

Python 调试器
左上角的 Debug 视图显示当前正在执行的进程和线程,右上角的 Variables 视图显示当前运行域中的所有变量,Python 编辑器会显示调试器目前停在哪条语句上,同时所有的输出信息都显示与 Console 视图中。调试器可以通过 Debug 视图底部的按钮或 Run 菜单进行控制。


Eclipse 中使用 Python 的交互式 shell
Python 解释器支持 Python 代码的交互式执行。这种方式对于调试一段代码是非常有用的,因为不用把代码放进 Python 脚本中并执行脚本了。同时,Python 解释器的交互模式可以很容易地集成到 Eclipse 中。
要增加对 Python 交互式执行的支持,可通过 Run > External Tools > External Tools 增加一个 External Tool 启动程序。这时将打开 External Tool 启动程序配置窗口。在 Configurations 列表中选择“Program”,然后点击“New”创建一个新的配置。将该配置命名为诸如 "pythonInteractive" 之类,然后设置 Location,令其指向您的 Python 解释器,接着,将 "-i" 作为唯一的参数传递进来
在 Common 选项卡下,选中复选框,使该配置在 External Tools 收藏夹菜单中显示出来。

Python 交互方式配置

要运行刚刚在 Eclipse 中创建的启动器,可选择 Run > External Tools > pythonInterpreter。Python 解释器的输出显示在 Console 视图中。Console 中可输入 Python 命令并执行,就像从命令行中执行 Python 一样。为导入并在交互模式下使用模块,您需要将模块的位置增加到 PYTHONPATH 环境变量中。
在 Eclipse Console 中执行 Python 与用命令行执行的不同之处在于,无法启用命令历史特性(通过向上和向下的方向键实现),因为 Eclipse Console 会自己解释这些键。

在 Python 开发中使用 Ant
Python 会在它需要的时候自动编译模块。这意味着 Python 开发人员通常不必显式地对模块进行编辑。即便如此,有时候手工编译 Python 代码还是很有用的,同时,构建和部署过程中还有很多其他方面的内容可以自动化实现。这也正是构建工具的用武之地。
我将着重介绍来自 Java 编程世界中的 Apache Ant,这个工具可大量应用在 Python 开发中。Apache Ant 是 Java 编程领域内事实上的标准构建工具。它更加轻便,与 Java 技术结合得更好,可用于替代其他的构建工具。Ant 可以在支持 Java 编程语言的任何一种平台上运行。尽管我们需要的大多数构建特性 Ant 都已经提供了,但如果要将 Ant 用做 Python 构建工具,还是需要有一些关键的与 Python 相关的特性。我已经开发了若干定制的 Ant 插件(用 Ant 的行话讲叫做 task),可提供构建 Python 时需要的特定于 Python 的特性。
Ant 用 XML 作为描述构建的格式。build 文件组织为需要执行的目标。每一个目标都可能依赖于其他的目标。Ant 将根据您所请求执行的目标,以及一组依赖目标,来执行任何需要的目标。每一个目标都可能包含任意数量的 Ant 任务,而由 Ant 任务实际执行目标的工作。Ant 有很多内置的任务,可以完成诸如编译 Java 代码、生成文档、操纵文件和目录,同时第三方又提供了很多附加的任务。

安装 Python Ant
我将通过为 feedparser 项目创建构建脚本来介绍 Ant 构建脚本和 Python Ant 任务的基础知识。为了使用 Python Ant 任务,您需要下载并安装包含这些任务的 Java 库。首先,从
列出的 URL 中下载 Python Ant 任务库(pyAntTasks.jar)。然后,将 JAR 文件拷贝到 Eclipse 的 Ant 插件下的 lib 目录中。这应该是 Eclipse 安装目录下形如 plugins/org.apache.ant_1.5.3 的子目录。
Python Ant 任务库拷贝完毕之后,必须在 Eclipse 中启用库。选择 Window > Preferences,然后选择 Ant > Runtime。将 Ant Home Entries 展开,其中可看到 Eclipse 使用的库(JAR 文件)列表。选择“ Add JAR”,然后从 Eclipse Ant 插件的 lib 目录中选择 Python Ant JAR 文件,就可以将刚刚拷贝的 Python Ant JAR 文件加入库列表中。

向 classpath 中加入 Python Ant 任务

您现在应该能够创建和运行包含 Python 任务的 Ant 构建脚本了。下面进入构建脚本内部!
创建构建脚本
我将逐步介绍如何创建一个简单的 Python 构建脚本(请参阅清单 1)。完整的构建脚本 build.xml 可从 feedParserTest 项目的顶层目录中找到。

清单 1. 用于编译 Python 源代码的构建脚本片断

<project name="feedParserTest" default="compile">
<taskdef resource="pyAntTasks.properties"/>
<property name="src.dir" value="src"/>
<target name="compile">
<py-compile dir="${src.dir}" pyth optimize="0"/>
</target>
</project>

先介绍一个只编译 Python 样例代码的构建脚本。<project> 标签总是构建脚本的根标签。<taskdef> 标签声明在整个构建脚本中使用的 Python 任务。在构建脚本的底部,可以定义 compile 目标。目标元素内部是 compile 运行期间执行的任务。特别的是 py-compile 任务,它负责从 src 目录开始,编译所有的 Python 代码。该任务会递归遍历所有的子目录,并编译所有的 Python 模块。脚本中没有采用将 src 目录硬编码到调用之处的方式,而是在构建脚本中定义了称为 src.dir 的属性。然后,在需要使用这个目录名的时候,就可以通过 ${src.dir} 来引用。
要运行构建脚本,可从 Eclipse 中打开它。Eclipse 具有内置的 Ant 构建脚本编辑和浏览功能。Outline 视图可以显示出构建脚本的结构。在 Navigator 视图中,选择该构建脚本,用右键点击,然后选择“Run Ant...”。选择 compile 目标,然后点击“Run”。构建脚本执行过程中的输出信息应该显示在 Console 视图中,表示运行成功。
Python 脚本执行任务
接下来将向构建脚本中加入新的目标,用于执行 Python 脚本(请参阅清单 2)。在本例中,可以将 RSS URL 作为参数来执行 feedparser.py 脚本。

清单 2. 运行 feedparser 脚本的构建脚本片断

<target name="run.feedparser" depends="compile">
<py-run script="src/feedparser/feedparser.py" pyth optimize="0">
<arg value="http://www.ibm.com/developerworks/news/dw_dwtp.rss">
</py-run>
</target>

上面的目标以 RSS URL 为唯一的参数来执行 feedparser.py 脚本。该目标声明为依赖于 compile 目标,所以后者将首先执行。实际上这一步并不是很必要,因为 Python 会根据需要自动编译源代码。如果您执行 run.feedparser 目标,就会运行 feedparser.py 脚本,同时将 RSS 的内容输出到 Console 中。
Python
Tags: 

延伸阅读

最新评论

发表评论