首页 文章

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

提问于
浏览
5

系统中安装了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

现在我遇到了我想要解决的两个问题 .

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个模块?

谢谢 .

3 回答

  • 4

    1)调用python 2.7

    简而言之:不要't do this. There are reasons why the path is called ' /usr/lib/python2.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库的位置 . 默认情况下,在$ / lib / python [version]和$ / lib / python [version]中搜索库,其中$ 和$ 是依赖于安装的目录,两者都是默认的到/ usr / local

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

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

    [编辑:收到niboshi的评论后添加了第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.pathsys.path.insert(0, '/home/user/local/lib/python2.7') ) .

    或者使用其他名称将特定模块复制到项目中 . 例如,我将_2.28806_模块从Python 2.7复制到我的项目_8225807_,在我需要的地方 OrderedDict 我做 from collection27 import OrderedDict

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

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

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

    我建议pythonbrew作为一个更容易的选择 .

    一旦安装了pythonbrew:

    $ pythonbrew install 2.7.2
    $ pythonbrew switch 2.7.2
    

相关问题