5

系统中安装了 Python 2.6。

现在我想使用 Python 2.7 中引入的模块。因为我没有root权限,所以我在我的主目录($HOME/local/)下构建并安装了2.7

我在 $HOME/.bashrc 中添加了以下内容:

export PATH=$HOME/local/bin:$PATH
export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH

现在我遇到了我想寻求解决方法的两个问题。

1. 调用 Python 2.7

新安装的 Python 2.7 在系统的库路径 (/usr/lib/python2.6/site-packages/) 中找不到 2.6 模块。

我应该手动将它添加到 PYTHONPATH 吗?有没有更好的解决方案?

2. 调用 Python 2.6

Python 2.6 在启动时抱怨:

'import site' failed; use -v for traceback

我猜它正在尝试加载 2.7 模块(在 $HOME/local/lib/python2.7 中)。调用 Python 2.6 时是否可以仅加载 2.6 模块?

谢谢。

4

3 回答 3

4

1)调用python 2.7

简而言之:不要这样做。路径被称为“/usr/lib/python* 2.6 */site-packages/”是有原因的。

一个原因是,在此目录中通常存储“已编译”的 python 文件 (.pyc)。python 2.6 和 python 2.7 .pyc 文件不兼容:

$ python2.7 /usr/lib/python2.6/sitecustomize.pyc
RuntimeError: Bad magic number in .pyc file

python 将跳过它无法理解的 pyc 文件,但您至少会失去预编译文件的好处。

另一个原因是,事情可能会混淆:

$ strace -f python2.7 /usr/lib/python2.6/sitecustomize.py
...
stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/etc/python2.6/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/python2.6/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/python2.7/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.7/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/python2.7/plat-linux2/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory)
...

在你的情况下,我会在 python2.7 目录中安装 python 2.7 所需的模块。

2)调用python 2.6

您可能想查看描述 PYTHONHOME 的手册页部分:

PYTHONHOME:更改标准 Python 库的位置。默认情况下,在 ${prefix}/lib/python[version] 和 ${exec_prefix}/lib/python[version] 中搜索库,其中 ${prefix} 和 ${exec_prefix} 是安装相关目录,均默认到 /usr/local

您可以将 python 2.7 特定文件/模块存储在本地安装的相应目录中。这些文件/模块只会在您运行特定版本的 python 时被拾取。在这种情况下,您不得设置 PYTHONPATH(或 PYTHONHOME)。

注意:这正是 Debian(可能还有其他发行版)管理不同同时安装的 python 版本的方式。

[编辑:在收到 niboshi 的评论后添加了第 1 节。]

于 2012-03-04T08:27:12.763 回答
2

在启动时,Python 获取PYTHONPATH环境变量并将其放入sys.path变量中。当您尝试导入模块时,它会查看路径sys.path

因为:

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH

您的 Python 2.7 路径位于sys.pathPython 2.6 路径之前的开头(您可以print sys.path查看)。这意味着来自的模块$HOME/local/lib/python2.7将具有优先级。

要自定义某些脚本的路径,可以为每个脚本设置,也可以在完成任何导入之前在脚本中PYTHONPATH修改sys.path( 。sys.path.insert(0, '/home/user/local/lib/python2.7')

或者以不同的名称将特定模块复制到您的项目中。例如,我使用 as 将collections模块从 Python 2.7 复制到我的项目中,并且在我collections27.py需要的地方OrderedDictfrom collection27 import OrderedDict

调用 Python 2.6 时是否可以仅加载 2.6 模块?

是的,我猜。只需确保路径中只有 Python 2.6 模块 - 不要使用:

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
于 2012-03-04T07:47:01.407 回答
0

我可以建议将 pythonbrew作为一个更简单的选择。

一旦你安装了 pythonbrew:

$ pythonbrew install 2.7.2
$ pythonbrew switch 2.7.2
于 2012-03-04T08:01:25.450 回答