系统中安装了Python 2.6。
现在我想使用Python 2.7中引入的模块。因为我没有root权限,所以我建立了&在我的主目录下安装了2.7($ HOME / local /)
我在$ HOME / .bashrc中添加了以下内容:
export PATH=$HOME/local/bin:$PATH
export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
现在我遇到了我想要解决的两个问题。
新安装的Python 2.7在系统的库路径中找不到2.6模块(/usr/lib/python2.6/site-packages /)。
我应该手动将它添加到PYTHONPATH吗?有没有更好的解决方案?
Python 2.6在启动时抱怨:
'import site' failed; use -v for traceback
我猜它正在尝试加载2.7个模块(在$ HOME / local / lib / python2.7中)。 调用Python 2.6时是否可以只加载2.6个模块?
感谢。
答案 0 :(得分:4)
简而言之:不要这样做。 路径被称为'/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所需的模块。
您可能想要查看描述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部分。]
答案 1 :(得分:2)
在启动时,Python获取PYTHONPATH
环境变量并将其放入sys.path
变量中。
当您尝试导入模块时,它会查看sys.path
因为:
export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
您的Python 2.7路径位于sys.path
的开头,在Python 2.6的路径之前(您可以print sys.path
进行检查)。这意味着来自$HOME/local/lib/python2.7
的模块将具有优先级。
要自定义某些脚本的路径,请为每个脚本设置PYTHONPATH
,或者在导入完成之前在脚本中修改sys.path
(sys.path.insert(0, '/home/user/local/lib/python2.7')
。
或者使用其他名称将特定模块复制到项目中。例如,我将{2}模块从Python 2.7复制到我的项目collections
,并在我需要collections27.py
的地方OrderedDict
调用Python 2.6时是否可以仅加载2.6个模块?
是的,我猜。只需确保路径中只有Python 2.6模块 - 不要使用:
from collection27 import OrderedDict
答案 2 :(得分:0)