为什么我得到一个像这样设置PYTHONPATH的ImportError?

时间:2014-08-08 14:45:40

标签: python importerror pythonpath

我的PYTHONPATH包含以下路径:

/path/to/venv/local/lib/python2.7/site-packages

我在site-packages中有以下相关的dir结构:

graphite
  |
   --webapp
       |
        graphite
            |
             -- __init__.py
             --   .....

如果我(venv) cd /path/to/venv/local/lib/python2.7/site-packages/graphite/webapp; ipython,那么我使用import graphite导入时没有问题。然而,如果cwd不是那个,而是elswhere,我正在努力导入模块。例如,在我的virtualenv:

(venv) cd ~
(venv) ipython

接着是

from graphite.webapp import graphite

from .graphite.webapp import graphite

抛出ImportError

为什么我的PYTHONPATH包含上述目录?

1 个答案:

答案 0 :(得分:0)

您已经清楚地解释了这种情况(感谢您展示了这棵树)。我认为“grahite”是一个错字。你观察到的是预期的。您的/path/to/venv/local/lib/python2.7/site-packages/graphite目录是一个包,因为它不包含__init__.py文件。

来自https://docs.python.org/2/tutorial/modules.html

  

需要__init__.py个文件才能让Python对待   目录包含包;这是为了防止   无意中具有通用名称的目录,例如string   隐藏稍后在模块搜索路径上出现的有效模块。

因此,虽然您的站点包中有一个graphite目录,但它不被视为包。你说“我正在努力导入模块”,所以我猜你不是100%熟悉软件包和模块之间的区别,所以你真的应该再次讨论引用的Python文档部分。

现在,如果您在__init__.py目录中创建了一个/path/to/venv/local/lib/python2.7/site-packages/graphite文件,那么用import graphite从哪里 - 用你的话说 - “cwd不是那个但是elswhere”会加载那“上层”石墨包装。请注意,import graphite取消引用/path/to/venv/local/lib/python2.7/site-packages/graphite/webapp/graphite不一样。这是两个不同的包,其中一个是另一个的子包。您需要决定从哪里导入哪一个,即需要整理出包结构。