【问题标题】:How to import from the __init__.py in the same directory?如何从同一目录下的 __init__.py 导入?
【发布时间】:2017-03-17 15:58:12
【问题描述】:

假设我有一个模块rules,其结构如下:

rules
├── conditions.py
├── __init__.py

在脚本conditions.py 中,我想导入一个在__init__.py 中定义的名为RuleParserError 的类。但是,我无法弄清楚如何做到这一点。 (按照Python: How to import from an __init__.py file?我试过了

from . import RuleParserError

但这会在尝试将conditions.py 运行为__main__ 时导致ImportError: cannot import name RuleParserError

【问题讨论】:

    标签: python


    【解决方案1】:

    我将“从父模块导入”视为 Python 中的反模式。进口应该反过来。从模块的__init__.py 导入尤其成问题。正如您所注意到的,从foo/bar.py 导入模块foo.bar 涉及首先导入foo/__init__.py,您最终可能会遇到循环依赖。在您的初始化文件中添加print("Importing", __name__) 有助于查看顺序并了解问题。

    我建议您将要在 conditions.py 中导入的代码从 __init__.py 移动到单独的较低级别的模块中,然后从 __init__.py 中的该模块中导入一些名称以在较高级别公开它.

    假设您的__init__.py 中有一些class Bar。我会按照以下方式重新组织它。

    __init__.py:

    from bar import Bar  # exposed at the higher level, as it used to be.
    

    bar.py:

    class Bar(object): ...
    

    conditions.py:

    from . import Bar  # Now it works.
    

    理想情况下,__init__.py 应该只包含来自低级模块的导入,或者根本不包含任何内容。

    【讨论】:

      【解决方案2】:

      如果你得到

      ImportError: attempted relative import with no known parent package

      当你喜欢时

      import . from something
      

      尤其是从执行的脚本中,试试看

      from __init__ import something
      

      即使在sys.path 中有很多__init__.py 时可能会出现问题,但在一些简单的情况下会有所帮助。

      【讨论】:

        【解决方案3】:

        在脚本顶部添加__package__

        __package__ = "pkg.dir.dir"
        

        解决问题

        在这种情况下

        __package__ = "rules"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 2020-02-13
          • 2021-09-13
          • 1970-01-01
          • 2017-03-12
          • 2015-07-30
          • 2013-07-29
          相关资源
          最近更新 更多