关于PYTHONPATH的Python2.x多版本问题
系统中安装了Python 2.6 现在我想使用Python 2.7中引入的模块。因为我没有root权限,所以我在我的主目录($home/local/)下构建并安装了2.7 我在$HOME/.bashrc中添加了以下内容:关于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
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')
或者以不同的名称将特定模块复制到您的项目中。例如,我使用ascollections27.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。