【问题标题】:Python 2.x multiple version issues regarding PYTHONPATHPython 2.x 关于 PYTHONPATH 的多个版本问题
【发布时间】:2012-03-22 02:43:08
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: python python-2.x pythonpath


    【解决方案1】:

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

    【讨论】:

    • 我认为问题 2 应该用这个来解决,但问题 1 不是。无论如何,谢谢你告诉我 PYTHONHOME。
    【解决方案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')

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

    是否可以在调用 Python 2.6 时只加载 2.6 模块?

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

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

    【讨论】:

    • 1.您可以将例如 collections.py (以及您需要的其他模块复制到您的项目文件夹中。首先在您的项目目录中搜索模块,因此当您执行 import collections 时,将导入项目文件夹中的一个。2。调整 PYTHONPATH。如果您希望 Python 2.6 中的库具有优先权 - 将它们的路径放在首位。注意:检查哪些路径有效打印脚本中的 sys.path。
    【解决方案3】:

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

    一旦你安装了 pythonbrew:

    $ pythonbrew install 2.7.2
    $ pythonbrew switch 2.7.2
    

    【讨论】:

    • 看起来不错。但由于我的系统中没有网络,我无法使用它。
    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多