我的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
包含上述目录?
答案 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
的不一样。这是两个不同的包,其中一个是另一个的子包。您需要决定从哪里导入哪一个,即需要整理出包结构。