Gentoo下的Python

Gentoo 对 Python 的支持很有特色,给用户提供了很大的灵活性。

这一篇是对 python-r1 User's Guide 的翻译、学习。

Gentoo支持多种Python实现

当前,Python 支持3中不同的 Python 解释器—— CPython、PyPy 和 Jython 。其中,CPython 又有两个不同的主要分支—— Python2 和 Python3 。所以总的来说,可以分为4类: CPython2、CPython3、PyPy、Jython 。

对于每一类,又能进一步分成一系列子分支,有子版本号来表示,例如 Python2.7、Python2.6、Python2.5;Python3.3、Python3.2、Python3.1 。

这些版本可以同时在 Gentoo 上安装,它们统称为 Python 实现。

为什么要同时安装多种Python实现?

有许多 Gentoo 里的包现在还不支持 Python3 。当然,也有许多包已经支持 Python3 了。为了对这两种情况都进行兼容, Gentoo 同时安装了 Python2 和 Python3.

这样,不论是 Python2 的程序,还是 Python3 的程序,都可以在 Gentoo 下成功运行。

PYTHON_TARGETS和PYTHON_SINGLE_TARGET设置

为了从多种实现中进行选择,现在的 Python 包给予了用户选择一个或者多个特定 Python 的能力。这种选择,是通过 USE 标志实现的。

有两个相关的 USE 变量:PYTHON_TARGETS和PYTHON_SINGLE_TARGET

PYTHON_TARGETS 被用于有多种 Python 实现可以被同时启用的时候。因此,它可以列出多种解释器。

PYTHON_SINGLE_TARGET 被用于只有一种解释器可以被启用的时候,它优先于 PYTHON_TARGETS 。它只能列出一种实现。

默认启用的是 Python2.7 和 Python3.2 ,其中 Python2.7 被用于不支持多种实现的包。这些默认设置可以在 make.conf 中通过覆盖相关变量进行重设。

变量可以取这些值:

对于 CPython :pythonX_Y

对于 PyPy : pypyX_Y

对于 Jython : jythonX_Y

make.conf 修改实例:

PYTHON_TARGETS="python2_6 python2_7 python3_2"
PYTHON_SINGLE_TARGET="python2_7"

修改单个包使用的实现

可以在 package.use 中对单个的包进行指定:

package.use 修改实例:

app-portage/flaggie python_targets_python3_1

net-libs/libproxy python_targets_python3_1 python_single_target_python3_1 -python_single_target_python2_7

注意, package.use 中做出的指定,只是对 make.conf 中的变量进行追加。所以说,如果要取消 make.conf 中的变量中的某一个实现,要明确地指出,例如:-python_single_target_python2_7

通过 emerge --verbose 可以显示出一个包可以使用的实现。

选择活跃的Python实现

app-admin/eselect-python 包提供了一个工具,用来选择当前的活跃的 Python 实现。利用它可以选择激活 Python2 和 Python3 ,并选择哪一个优先。

eselect-python 可以影响到这些:

python 命令启动 python2 还是 python3 解释器。

对于未指定版本的 Python 脚本,默认加载哪个解释器。

eselect python list 可以列出当前系统中已经安装的 Python 版本。

eselect python set python3.2 的作用是,首选 Python3 ,并且使用 3.2 版本。

eselect python set --python3 python3.2 与上面不同,仅指定 Python3 使用的版本,而并没有指定2和3中哪个作为首选。

unsatisfied REQUIRED_USE flag constraint

当安装或者升级一个包时, portage 有时会报这个错误。

这个错误的意思是,你试图安装的这个包,并不支持你系统上的 Python 实现。

最普遍的情况是,这个出问题的包不支持你选择的特定的 python 的版本,这个问题可以通过在 PYTHON_TARGETS 中加入这个包支持的实现版本来解决。

在一些特定的情况中,是由于特定的包并不适合你的系统,或者在你的系统上并不需要。例如 argparse 这个 Python 模块,在 CPython2.7、3.2 和更新版本中被引入,因此,在使用以上 Python 版本的系统中,安装这个包是没有意义的(应为已经内置了)。所以删除这个包,问题就解决了。