在Python中,如何从同一目录中的__init__.py导入

时间:2017-03-17 15:58:12

标签: python

假设我有一个具有以下结构的模块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__

3 个答案:

答案 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"