关于PYTHONPATH的Python2.x多版本问题

关于PYTHONPATH的Python2.x多版本问题,python,python-2.x,pythonpath,Python,Python 2.x,Pythonpath,系统中安装了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.调用Python2.7 新安装的Python 2.7

系统中安装了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.调用Python2.7 新安装的Python 2.7在系统的库路径(/usr/lib/python2.6/site packages/)中找不到2.6模块

我应该手动将其添加到PYTHONPATH吗?有更好的解决办法吗

2.调用Python2.6 Python 2.6在启动时抱怨:

'import site' failed; use -v for traceback
我猜它试图加载2.7模块(在$HOME/local/lib/python2.7中)。 调用Python2.6时是否可以只加载2.6模块


谢谢。

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

因为:

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
Python2.7路径位于Python2.6路径之前的
sys.path
开头(您可以
print sys.path
进行检查)。这意味着来自
$HOME/local/lib/python2.7
的模块将具有优先级

要自定义某些脚本的路径,请在执行任何导入之前,在脚本中设置
PYTHONPATH
,或修改
sys.path
sys.path.insert(0,'/home/user/local/lib/python2.7')

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

调用Python2.6时是否可以只加载2.6模块

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

export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
我可以推荐一个更简单的选择吗

安装pythonbrew后:

$ pythonbrew install 2.7.2
$ pythonbrew switch 2.7.2
1) 调用Python2.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) 调用Python2.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节。]

看起来不错。但由于网络在我的系统中不可用,我不能使用它。我认为问题2应该用这个来解决,但问题1不能。无论如何,谢谢你告诉我关于蟒蛇之家的事。您可以复制例如collections.py(以及您需要添加到项目文件夹中的其他模块。首先会搜索您的项目目录中的模块,因此当您执行
导入集合
操作时,将导入项目文件夹中的模块。2.调整PYTHONPATH。如果希望Python 2.6中的LIB具有优先级,请将其路径放在第一位。注意:检查哪些路径有效打印正在脚本中删除sys.path。