【问题标题】:Import object declared inside __init__.py在 __init__.py 中声明的导入对象
【发布时间】:2014-10-04 07:05:43
【问题描述】:

我无法理解在“__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

但我真的很想了解,为什么 import 命令从 top 目录而不是 top/lib 工作。

谢谢。

【问题讨论】:

    标签: python python-module


    【解决方案1】:

    一般来说,我认为最好的做法是让模块/子包中的数据漏斗达到__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 导入 o​​k,因为它与您当前的工作目录相关 -- 与源文件无关。

    当您移动到lib 目录时,python 无法再在当前目录中找到lib,使其无法导入。请注意,对于大多数软件包,这是通过安装软件包来解决的,该软件包将其放置在 python 可以找到它而不需要位于当前目录中的地方。

    【讨论】:

    • 这很有意义。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2015-07-30
    • 2016-06-14
    • 2017-03-12
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多