附录 A:在 Jython 中使用其他工具

本附录的主要目的是提供有关在 Jython 中使用一些外部 Python 包的信息。在某些情况下,这些工具在 Jython 上的使用或安装方式可能与在 CPython 上有所不同,这些差异将在本附录中说明。由于网络上提供了大量关于这些工具用法的文档,本附录将重点介绍在 Jython 中使用这些工具的具体方法。但是,将引用相关的 URL,以便您找到有关每个主题的更多文档。

setuptools

Setuptools 是一个基于 distutils(标准 Python 分发工具)的库。它提供了一些高级工具,例如 easy_install,这是一个用于自动下载和安装给定 Python 包及其依赖项的命令。

要获取 setuptools,请从 http://peak.telecommunity.com/dist/ez_setup.py 下载 ez_setup.py。然后,转到您放置下载文件的目录并执行以下操作

$ jython ez_setup.py

输出将类似于以下内容

Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9-py2.5.egg
Processing setuptools-0.6c9-py2.5.egg
Copying setuptools-0.6c9-py2.5.egg to /home/lsoto/jython2.5.0/Lib/site-packages
Adding setuptools 0.6c9 to easy-install.pth file
Installing easy_install script to /home/lsoto/jython2.5.0/bin
Installing easy_install-2.5 script to /home/lsoto/jython2.5.0/bin

Installed /home/lsoto/jython2.5.0/Lib/site-packages/setuptools-0.6c9-py2.5.egg
Processing dependencies for setuptools==0.6c9
Finished processing dependencies for setuptools==0.6c9

如您在输出中所见,easy_install 脚本已安装到 Jython 安装的 bin 目录中(在上面的示例中为 /home/lsoto/jython2.5.0/bin)。如果您经常使用 Jython,最好将此目录添加到 PATH 环境变量中,这样您就不必每次使用 easy_install 或安装到此目录的其他脚本时都输入完整路径。从现在开始,我将假设这种情况。如果您出于任何原因不想将 Jython 的 bin 目录添加到您的 PATH 中,请记住在每个示例中输入完整路径(例如,当我输入 easy_install 时,请输入 /path/to/jython/bin/easy_install)。

好的,现在您有了 easy_install。接下来做什么?让我们用它来获取一个 Python 库!例如,假设我们需要从用 Jython 编写的程序中访问 Twitter,并且我们想使用 python-twitter 项目,该项目位于 http://code.google.com/p/python-twitter/

如果没有 easy_install,您需要访问该 URL,阅读构建说明,然后下载最新版本并执行一些命令,您就可以开始使用了。除了库通常依赖于其他库(例如 python-twitter 依赖于 simplejson),因此您需要重复此繁琐的过程几次。

使用 easy_install,您只需运行以下命令

$ easy_install python-twitter

您将获得以下输出

Searching for python-twitter
Reading http://pypi.python.org/simple/python-twitter/
Reading http://code.google.com/p/python-twitter/
Best match: python-twitter 0.6
Downloading http://python-twitter.googlecode.com/files/python-twitter-0.6.tar.gz
Processing python-twitter-0.6.tar.gz
Running python-twitter-0.6/setup.py -q bdist_egg --dist-dir /var/folders/mQ/mQkMNKiaE583pWpee85FFk+++TI/-Tmp-/easy_install-FU5COZ/python-twitter-0.6/egg-dist-tmp-EeR4RD
zip_safe flag not set; analyzing archive contents...
Unable to analyze compiled code on this platform.
Please ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py
Adding python-twitter 0.6 to easy-install.pth file

Installed /home/lsoto/jython2.5.0/Lib/site-packages/python_twitter-0.6-py2.5.egg
Processing dependencies for python-twitter
Searching for simplejson
Reading http://pypi.python.org/simple/simplejson/
Reading http://undefined.org/python/#simplejson
Best match: simplejson 2.0.9
Downloading http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.9.tar.gz#md5=af5e67a39ca3408563411d357e6d5e47
Processing simplejson-2.0.9.tar.gz
Running simplejson-2.0.9/setup.py -q bdist_egg --dist-dir /var/folders/mQ/mQkMNKiaE583pWpee85FFk+++TI/-Tmp-/easy_install-VgAKxa/simplejson-2.0.9/egg-dist-tmp-jcntqu
***************************************************************************
WARNING: The C extension could not be compiled, speedups are not enabled.
Failure information, if any, is above.
I'm retrying the build without the C extension now.
***************************************************************************
***************************************************************************
WARNING: The C extension could not be compiled, speedups are not enabled.
Plain-Python installation succeeded.
***************************************************************************
Adding simplejson 2.0.9 to easy-install.pth file

Installed /home/lsoto/jython2.5.0/Lib/site-packages/simplejson-2.0.9-py2.5.egg
Finished processing dependencies for python-twitter

输出有点冗长,但它详细地说明了 easy_install 自动执行的步骤。让我们逐段回顾一下

Searching for python-twitter
Reading http://pypi.python.org/simple/python-twitter/
Reading http://code.google.com/p/python-twitter/
Best match: python-twitter 0.6
Downloading http://python-twitter.googlecode.com/files/python-twitter-0.6.tar.gz

我们请求了“python-twitter”,它将在 PyPI(Python 包索引)上查找,PyPI 列出了社区制作的所有 Python 包。版本 0.6 被选中,因为它是我运行命令时最新的版本。

让我们看看easy_install输出的下一步是什么

Running python-twitter-0.6/setup.py -q bdist_egg --dist-dir /var/folders/mQ/mQkMNKiaE583pWpee85FFk+++TI/-Tmp-/easy_install-FU5COZ/python-twitter-0.6/egg-dist-tmp-EeR4RD
zip_safe flag not set; analyzing archive contents...
Unable to analyze compiled code on this platform.
Please ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py
Adding python-twitter 0.6 to easy-install.pth file

Installed /home/lsoto/jython2.5.0/Lib/site-packages/python_twitter-0.6-py2.5.egg

这里没什么特别的:它运行了安装库所需的命令。接下来的部分更有趣

Processing dependencies for python-twitter
Searching for simplejson
Reading http://pypi.python.org/simple/simplejson/
Reading http://undefined.org/python/#simplejson
Best match: simplejson 2.0.9
Downloading http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.9.tar.gz#md5=af5e67a39ca3408563411d357e6d5e47

如您所见,它发现了对 simplejson 的依赖,并且由于它尚未安装,因此正在下载。接下来我们看到

Processing simplejson-2.0.9.tar.gz
Running simplejson-2.0.9/setup.py -q bdist_egg --dist-dir /var/folders/mQ/mQkMNKiaE583pWpee85FFk+++TI/-Tmp-/easy_install-VgAKxa/simplejson-2.0.9/egg-dist-tmp-jcntqu
***************************************************************************
WARNING: The C extension could not be compiled, speedups are not enabled.
Failure information, if any, is above.
I'm retrying the build without the C extension now.
***************************************************************************
***************************************************************************
WARNING: The C extension could not be compiled, speedups are not enabled.
Plain-Python installation succeeded.
***************************************************************************
Adding simplejson 2.0.9 to easy-install.pth file

Installed /home/lsoto/jython2.5.0/Lib/site-packages/simplejson-2.0.9-py2.5.egg

这些警告是因为simplejson安装尝试编译一个 C 扩展,出于显而易见的原因,它只适用于 CPython,而不适用于 Jython。

最后,我们看到

Finished processing dependencies for python-twitter

这标志着 python-twitter 自动安装过程的结束。您可以通过运行 Jython 并对交互式解释器执行 import twitter 来测试它是否已成功安装。

如上所述,easy_install 将尝试获取您指定的库的最新版本。如果您想要特定版本,例如 python-twitter 的 0.5 版本,那么您可以通过这种方式指定它

$ easy_install python-twitter==0.5

警告

请注意,同时安装同一库的两个版本不是一个好主意。查看下面的 virtualenv 部分,了解解决运行需要不同版本库的不同程序问题的解决方案。

出于调试目的,了解使用 easy_install 安装的位在哪里始终很有用。正如您可以在安装输出中停止的那样,它们被安装到 <path-to-jython>/Lib/site-packages/<name_of_library>-<version>.egg 中,它可能是一个目录或一个压缩的 zip 文件。此外,easy_install 会在文件 <path-to-jython>/Lib/site-packages/easy-install.pth 中添加一个条目,最终默认情况下将目录或 zip 文件添加到 sys.path 中。

不幸的是,setuptools 没有提供任何自动卸载包的方法。您必须手动删除包 egg 目录或 zip 文件,并删除 easy-install.pth 上的关联行。

virtualenv

通常,在同一台机器上运行工具的不同版本会很好。virtualenv 工具提供了一种创建虚拟 Python 环境的方法,该环境可用于各种目的,包括安装不同的包版本。虚拟环境对于那些没有特定 Python 安装的管理访问权限但仍然需要能够向其安装包的人来说也很有用,这种情况在使用域主机时经常发生。无论情况如何,virtualenv 工具都提供了一种为特定 Python 安装创建一个或多个虚拟环境的方法,以便可以将库安装到受控环境中,而不是您的 Python 或 Jython 安装的全局 site-packages 区域。Jython 2.5.0 的发布为使用 virtualenv 等工具打开了新的大门。

要将 virtualenv 与 Jython 一起使用,我们首先需要获取它。最简单的方法是通过 Python 包索引。正如您在上一节中了解到的,easy_install 是从 PyPI 安装包的方法。以下示例展示了如何使用 Jython 使用 easy_install 安装 virtualenv。

::
jython easy_install.py virtualenv

安装完成后,使用该工具创建虚拟环境非常容易。虚拟环境将包含一个 Jython 可执行文件以及 setuptools 的安装和它自己的 site-packages 目录。这样做是为了让您能够从 PyPI 将不同的包安装到您的虚拟环境中。让我们使用存在于我们的 Jython 环境中的 virtualenv.py 模块创建一个名为 JY2.5.1Env 的环境。

jython <<path to Jython>>/jython2.5.1/Lib/site-packages/virtualenv-1.3.3-py2.5.egg/virtualenv.py JY2.5.1Env
New jython executable in JY2.5.1Env/bin/jython
Installing setuptools............done.

现在,应该在您的当前工作目录中创建了一个名为 JY2.5.1Env 的新目录。您可以通过简单地调用创建的可执行文件来从这个虚拟环境中运行 Jython。virtualenv 工具允许我们打开一个终端并通过使用 activate 命令将其指定为专门用于我们的虚拟 Jython 环境。为此,请打开一个终端并键入以下内容

source <path-to-virtual-environment/JY2.5.1Env/bin/activate

完成此操作后,您应该注意到命令行前缀是您激活的虚拟环境的名称。在此终端中使用的任何 Jython shell 或工具现在都将使用虚拟环境。这是一种使用特定库的两个不同版本运行工具或并排运行生产和开发环境的绝佳方法。如果您在激活的虚拟环境终端中运行 easy_install.py 工具,则该工具将被安装到虚拟环境中。一台特定机器上可以安装无限数量的虚拟环境。要停止在终端中使用虚拟环境,只需键入

deactivate

现在您的终端应该恢复正常使用并默认使用全局 Jython 安装。停用后,进行的任何 Jython 引用都将调用全局安装或全局 site-packages 区域内的库。需要注意的是,当您创建虚拟环境时,它会自动继承全局安装使用的所有包。因此,如果您在全局 site-packages 区域安装了库,那么它可以立即从虚拟环境中使用。一个好的做法是仅将基本库安装到全局 Jython 环境中,然后将一次性或测试库安装到虚拟环境中。

能够列出特定环境中使用的安装非常有用。一种方法是安装 *yolk* 实用程序并使用它的 *-l* 命令。为了安装 *yolk*,您必须获取 2.5.1 之后的最新版本的 Jython 的副本,因为已经提交了一个补丁来修复 *yolk* 使用的一些功能。您还必须使用 JDK 1.6 或更高版本,因为修补后的 Jython 版本使用了 *webbrowser* 模块。*webbrowser* 模块使用了一些仅在 JDK 1.6 及更高版本中可用的 java.awt.Desktop 功能。要安装 *yolk*,请使用 ez_install.py 脚本,如我们之前所示。

jython ez_install.py yolk

安装完成后,您可以通过发出 *-l* 命令来列出 Jython 安装的包安装,如下所示

yolk -l
Django          - 1.0.2-final  - non-active development (/jython2.5.1/Lib/site-packages)
Django          - 1.0.3        - active development (/jython2.5.1/Lib/site-packages/Django-1.0.3-py2.5.egg)
Django          - 1.1          - non-active development (/jython2.5.1/Lib/site-packages)
SQLAlchemy      - 0.5.4p2      - active development (/jython2.5.1/Lib/site-packages)
SQLAlchemy      - 0.6beta1     - non-active development (/jython2.5.1/Lib/site-packages)
django-jython   - 0.9          - active development (/jython2.5.1/Lib/site-packages/django_jython-0.9-py2.5.egg)
django-jython   - 1.0b1        - non-active development (/jython2.5.1/Lib/site-packages)
nose            - 0.11.1       - active development (/jython2.5.1/Lib/site-packages/nose-0.11.1-py2.5.egg)
setuptools      - 0.6c9        - active
setuptools      - 0.6c9        - active
snakefight      - 0.4          - active development (/jython2.5.1/Lib/site-packages/snakefight-0.4-py2.5.egg)
virtualenv      - 1.3.3        - active development (/jython2.5.1/Lib/site-packages/virtualenv-1.3.3-py2.5.egg)
wsgiref         - 0.1.2        - active development (/jython2.5.1/Lib)
yolk            - 0.4.1        - active

如您所见,将列出所有已安装的包。如果您从虚拟环境中使用 yolk,那么您将看到安装在该虚拟环境中的所有包以及安装到全局环境中的所有包。

与 setuptools 类似,无法自动卸载 virtualenv。您还必须手动删除包 egg 目录或 zip 文件,以及删除 easy-install.pth 中的引用。