假设我有一个具有以下结构的模块rules
:
rules
├── conditions.py
├── __init__.py
在脚本conditions.py
中,我想导入RuleParserError
中定义的名为__init__.py
的类。但是,我还没弄清楚如何做到这一点。 (关注Python: How to import from an __init__.py file?我试过了
from . import RuleParserError
但尝试将ImportError: cannot import name RuleParserError
作为conditions.py
运行时,这会导致__main__
。
答案 0 :(得分:3)
我看到从父模块导入'作为Python中的反模式。进口应该是另一种方式。从模块__init__.py
导入特别成问题。如您所知,从foo.bar
导入模块foo/bar.py
涉及首先导入foo/__init__.py
,最终可能会出现循环依赖关系。在初始化文件中添加print __name__
有助于查看序列并了解问题。
我建议您将conditions.py
中要导入的代码从__init__.py
移到另一个较低级别的模块,然后在{{1}中导入该模块中的一些名称在更高级别公开它。
假设您的__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.
应该只包含从较低级别模块导入的内容,或者根本不包含任何内容。
答案 1 :(得分:2)
如果你得到
ImportError: attempted relative import with no known parent package
当你喜欢时
import . from something
特别是从执行的脚本来看,试试
from __init__ import something
即使在 __init__.py
中有很多 sys.path
时可能会出现问题,但在一些简单的情况下它会有所帮助。
答案 2 :(得分:0)
在脚本顶部添加 __package__
__package__ = "pkg.dir.dir"
解决问题
在这种情况下
__package__ = "rules"