在__init__.py中声明的导入对象

时间:2014-10-04 07:05:44

标签: python python-module

我无法理解如何将'__init__.py'中声明的对象导入其他文件。

我有一个像这样的目录结构

top/
 |
 |_lib/
    |_ __init__.py
    |_ one.py

文件内容如下

lib / __ init __。py

a=object()

lib / one.py

from lib import a

这是问题所在。如果我从top目录触发python shell,则以下命令运行良好

>>> from lib.one import a

但是,如果我将目录更改为top/lib并在新的python shell中触发类似命令,则会出错。

>>>  from one import a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "one.py", line 1, in <module>
  from lib import a
ImportError: No module named lib

当然,我可以像这样改变one.py,这将使一切运转起来。

from __init__ import a

但我真的想了解,为什么导入命令可以从top目录而不是top/lib起作用。

感谢。

1 个答案:

答案 0 :(得分:4)

一般来说,我认为最好的做法是从模块/子包中将数据漏斗到__init__.py,而不是需要依赖周围模块中__init__.py的数据。换句话说,__init__.py可以使用one.py,但one.py不应该使用__init__.py中的数据/函数。

现在,问你的问题......

它适用于top,因为python执行相对导入(在python3.x IIRC中消失了,所以不要依赖它;-)。换句话说,python在当前目录中查找模块或包名lib并导入它。到目前为止,这一切都很好。正在运行from lib.one import a首先导入lib__init__.py),工作正常。然后导入one - lib仍可从one导入,因为它相对于您当前的工作目录 - 与源文件无关。

当你进入lib目录时,python在当前目录中找不到lib,使其无法导入。请注意,对于大多数软件包,可以通过安装软件包来解决这个问题,该软件包将python可以找到它,而不需要在当前目录中。