繁体   English   中英

有关PYTHONPATH的Python 2.x多个版本问题

[英]Python 2.x multiple version issues regarding 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.调用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模块?

谢谢。

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节。]

在启动时,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.pathsys.path.insert(0, '/home/user/local/lib/python2.7') / PYTHONPATH /user/ PYTHONPATH / PYTHONPATH / PYTHONPATH sys.path.insert(0, '/home/user/local/lib/python2.7')任何导入都完成。

或使用其他名称将特定模块复制到项目中。 例如,我将collections模块从Python 2.7复制到我的项目中,作为collections27.py ,在需要OrderedDict地方,我from collection27 import OrderedDict

调用Python 2.6时是否只能加载2.6模块?

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

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

我可以建议使用pythonbrew作为更简单的选择。

安装pythonbrew之后:

$ pythonbrew install 2.7.2
$ pythonbrew switch 2.7.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM