用户模块未优先加载(Python)
我在全局安装了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 个回答
一般来说,模块搜索路径的文档会列出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是否还存在这个问题,或许你应该更新到最新版本。