我无法理解如何将'__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
起作用。
感谢。
答案 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可以找到它,而不需要在当前目录中。