如何从同一目录下的__init__.py导入?

新手上路,请多包涵

假设我有一个模块 rules 具有以下结构:

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

在脚本 conditions.py 中,我想导入一个名为 RuleParserError 定义在 __init__.py 中的类。但是,我一直无法弄清楚如何做到这一点。 (以下 Python:如何从 init.py 文件导入? 我试过了

from . import RuleParserError

但这会导致 ImportError: cannot import name RuleParserError 尝试运行 conditions.py as __main__ )。

原文由 Kurt Peek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
2 个回答

我将“从父模块导入”视为 Python 中的反模式。进口应该是相反的。从模块的 __init__.py 导入尤其有问题。正如您所注意到的,从 foo/bar.py 导入模块 foo.bar --- 涉及导入 foo/__init__.py 首先,你可能会以循环依赖告终。添加 print("Importing", __name__) 到您的 init 文件有助于查看序列并理解问题。

我建议您将要在 conditions.py 中导入的代码从 __init__.py 移动到一个单独的较低级别的模块,然后只需从该模块中导入一些名称 __init__.py 在更高层次上揭露它。

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

__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 应该只包含从较低级别模块导入的内容,或者什么也不包含。

原文由 9000 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你得到

ImportError: attempted relative import with no known parent package

当你喜欢

import . from something

特别是从执行的脚本中,只需尝试

from __init__ import something

尽管当 --- 中有许多 __init__.py sys.path 可能会出现问题,但它在一些简单的情况下会有所帮助。

原文由 ghchoi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题