用户模块未优先加载(Python)

6 投票
1 回答
943 浏览
提问于 2025-04-18 09:18

我在全局安装了Pandas版本0.12.0,但有个用户需要0.13.0。我告诉他在自己的主目录里安装这个版本,他照做了,但当他输入import pandas时,还是找到了旧的模块。

于是我决定打印出他的sys.path,发现这些路径按这个顺序排列(为了简洁,其他的路径省略了):

[
    '',
    '/apps/python/2.7.5/lib/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg',
    '/home/user/.local/lib/python2.7/site-packages',
    '/apps/python/2.7.5/lib/python2.7/site-packages'

]

PYTHONPATH也在pandas之后出现:

[
    '',
    '/apps/python/2.7.5/lib/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg',
    '/usr/lib64', // this is the PYTHONPATH
    '/home/user/.local/lib/python2.7/site-packages',
    '/apps/python/2.7.5/lib/python2.7/site-packages'

]

是什么原因导致pandas-0.12.0被优先加载,而不是其他的,甚至包括PYTHONPATH里的内容?还有几个其他的包也有同样的问题。所有的包都是通过pip或者python setup.py install安装的;这两种方法会导致这样的情况吗?我觉得我们没有手动修改过什么。

1 个回答

2

一般来说,模块搜索路径的文档会列出Python导入源的优先级:https://docs.python.org/2/tutorial/modules.html#the-module-search-path。根据这个文档,PYTHONPATH的优先级紧跟在当前工作目录之后。

我很确定,pip安装的包之所以优先级高,是因为在你的网站包目录里有一些pth文件(不过,我没能快速找到这些pth文件和PYTHONPATH的优先级对比)。你可以看看https://docs.python.org/2/library/site.html,里面解释了这些文件是怎么工作的。有一个建议,应该能解决你的问题:

这个模块在初始化时会自动导入。可以通过解释器的-S选项来抑制这种自动导入。

PYTHONPATH在使用-S时仍然有效(在Python 2.7.3中测试过):

$ export PYTHONPATH="FOO"
$ python -S
>>> import sys
>>> "FOO" in sys.path
True

我发现这个解决方案在你还需要从site.py设置的路径中获取包时会有问题。不过,在这种情况下,仔细调整PYTHONPATH仍然会有所帮助。

补充:这看起来是一个长期存在的问题,涉及easy_install/setuptools/distribute。已知这些工具可能会添加到sys.path的前面,从而有效地覆盖PYTHONPATH,这通常是我们不希望发生的情况,具体可以参考https://bugs.launchpad.net/ubuntu/+source/distribute/+bug/821000。我不确定当前的pip和distribute是否还存在这个问题,或许你应该更新到最新版本。

撰写回答