【问题标题】:User modules aren't loaded first (Python)不首先加载用户模块(Python)
【发布时间】:2014-06-10 15:48:46
【问题描述】:

我已经在站点范围内安装了 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 安装;这两种方法都会导致这样的问题吗?我认为我们没有手动编辑任何内容。

【问题讨论】:

标签: python pip


【解决方案1】:

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

很确定 pip 安装包的高优先级来自站点包目录中的某些 pth 文件(但是,与 PYTHONPATH 相比,我无法快速找出这些 pth 文件的优先级)。看看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是否还有这个bug,也许你应该更新到这些的最新版本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2019-03-12
相关资源
最近更新 更多