0

问题

我似乎无法将我的包安装到正确的站点包目录。

背景

我想升级到 python 3.3,但我发现我仍然需要 python2.6 才能使用 yum(它没有为 python3 配置)。所以我的系统上都有。

每个版本单独的 pip 和 easy_install ???

问题是当我下载一个包并运行“python setup.py install”时,我发现它安装在python2.6中。我曾尝试使用 pip 和 easy_install,但它们也是如此。我读过一个解决方案是拥有不同版本的 pip(pip_2.6 和 pip_3.3)。但我找不到下载单独版本的方法。一种解决方法是在 pip 中给出“-d PathToSitePackages”参数,但这并不优雅。

其他未使用较新版本的程序

另一个问题是,我发现当我使用 sphinx 等系统时,它们使用的是旧版本的 python。我似乎无法弄清楚如何让他们使用更新版本的 python。

4

1 回答 1

1

首先,如果 X != V,Python 被明确设计为可以轻松同时拥有 Python XY 和 Python VW。PEP 394解释了细节,但基本上,python3总是意味着 3.x 版本,如果python也意味着3.x 版本,python2将意味着 2.x 版本。对于所有表现良好的紧密集成脚本(如pipor )也应如此ipython

这是一件好事,因为许多 POSIX 平台(大多数 linux 发行版、OS X 等)包含依赖于特定 Python 版本的代码,因此您必须能够拥有该版本,但通常您想要更新的版本为您自己的代码。

在大多数平台上,即使 X == V,只要 Y != W,事情仍然很容易,因为默认安装也会为您提供 pythonX.Y,并且设置好的脚本也会这样做。这部分不是 PEP 强制要求的,所以一些 linux 发行版不这样做,或者以不同的方式这样做。不过好在你只需要2.6和3.3,所以不用担心这部分。


因此,如果您只是pip使用 Python XY, 以任何常规方式安装,您将在 Python XY 的站点包中获得一些新包,可能是一个名为的脚本pip-X.Y(请注意,它是一个连字符,而不是下划线),通常是一个符号链接pip和/或pip3该脚本。所以,你不需要做任何事情来得到这个。

特别是,测试这个序列(文档推荐的系统范围安装方式):

$ curl -O https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
$ sudo python3.3 ez_setup.py
$ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo python3.3 get-pip.py

......我最终就是这样。

如果没有,您必须向我们提供有关您的平台的详细信息,如何安装每个 Python(大概 2.6 是系统安装的一部分,但不是 3.3),以及如何安装每个pip.


如果您改为使用sudo yum install python-pipand sudo yum install python33-pip(or python3-pip),那么您得到的正是发行版,因此您最终可能会得到pip(for 2.6) and pip-3.3(for 3.3),而不是pip-2.6andpip-3.3和符号链接pipand pip3。查看各种发行版软件包的 RPM 内容,看起来类似 Red-Hat 的系统的标准名称是python3-pip,带有指向 的符号链接pip-python3,有时还有其他名称。


无论如何,除非你混合和匹配不同的方法,否则你几乎肯定会找到一些方法来区分这两个pip版本。


如果最坏的情况发生了,并且您刚刚获得了一个名为 的脚本pip,并且您最后安装的那个会覆盖您首先安装的那个……您总是可以安装第一个cp pip pip-2.6,安装第二个,然后mv pip pip-3.3; ln -s pip-2.6 pip; ln -s pip-3.3 pip3

或者,如果你连这个都做不到,那么脚本就很简单,就像这样:

#!/usr/local/bin/python3.3
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.2.1','console_scripts','pip-3.3'
__requires__ = 'pip==1.2.1'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pip==1.2.1', 'console_scripts', 'pip-3.3')()
    )

而且您可以只制作一个副本并复制 s/3.3/2.6/g (如果您以某种方式将不同版本的 1.2.1 安装pip到不同的站点包中,您可能还必须替换 1.2.1)并且它会起作用。

但它真的,真的不应该走到这一步,然而。setuptools 和 pip 都尊重 PEP 394,任何不需要规则的包管理器或其python 3 包都是无用的。因此,如果您认为这些技巧是必要的,那么您之前可能做错了什么。

于 2013-09-19T20:55:58.593 回答