我已经在站点范围内安装了 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'
]
Run Code Online (Sandbox Code Playgroud)
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'
]
Run Code Online (Sandbox Code Playgroud)
什么会导致 pandas-0.12.0 在其他任何东西(甚至是 PYTHONPATH)之前被专门加载?还有其他几个包也表现出相同的行为。所有软件包均已通过pip
或通过执行安装python setup.py install
;这两种方法都会导致这样的问题吗?我认为我们没有手动编辑任何内容。
一般来说,模块搜索路径文档列出了Python导入源的优先级:https://docs.python.org/2/tutorial/modules.html#the-module-search-path。据此,PYTHONPATH
它紧随当前工作目录之后。
可以肯定,pip 安装的软件包的高优先级来自于 site-packages 目录中的某些文件(但是,与 相比pth
,我无法快速找出这些文件的优先级)。查看https://docs.python.org/2/library/site.html,其中解释了这些文件的工作原理。有一个建议应该可以解决您的问题:pth
PYTHONPATH
\n\n\n该模块在初始化期间自动导入。可以使用解释器\xe2\x80\x99s -S 选项抑制自动导入。
\n
PYTHONPATH 仍然存在-S
(使用 Python 2.7.3 进行测试):
$ export PYTHONPATH="FOO"\n$ python -S\n>>> import sys\n>>> "FOO" in sys.path\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n\n我发现这个解决方案是有问题的,如果您还需要来自设置的路径的包site.py
。然而,在这种情况下,仔细调整PYTHONPATH
仍然会有帮助。
编辑:这看起来像是 easy_install/setuptools/distribute 的一个长期存在的问题。众所周知,这些可能会前置于sys.path
,有效地覆盖PYTHONPATH
,这通常是不受欢迎的行为,请参阅https://bugs.launchpad.net/ubuntu/+source/distribute/+bug/821000。我不确定当前的 pip 和 Distribution 是否仍然存在此错误,也许您应该更新到这些的最新版本。