如何从同一目录导入Python类文件?

46

我在我的 Python 3.3 项目中有一个目录名为 /models。

从我的 main.py 中,我只需要执行一个

from models import *

在我的__init__.py文件中:

__all__ = ["Engine","EngineModule","Finding","Mapping","Rule","RuleSet"]
from models.engine import Engine,EngineModule
from models.finding import Finding
from models.mapping import Mapping
from models.rule import Rule
from models.ruleset import RuleSet

这在我的应用程序中运行得非常好。

我有一个依赖于另一个模型的模型,因此在我的engine.py中,我需要在engine.py中导入finding.py。当我执行:from finding import Finding时,出现错误No Such Module exists

如何从同一模块/目录中的文件A导入类B?


1
你正在使用哪个版本的Python? - Wooble
我正在使用 Python 3.3 - Yablargo
4
Python 3 不允许使用隐式相对导入。 - Wooble
1
@Yablargo,你能否将你的_Edit 1_部分移动并发布为自答(from .finding import Finding)? - kenorb
2个回答

61

由于您使用的是Python 3,相对导入已被禁止(它可能导致不同包中具有相同名称的模块之间的混淆)。

请使用以下任一方法:

from models import finding
或者
import models.finding

或者,最好的选择:

from . import finding  # The . means "from the same directory as this module"

9
我认为最后一个应该是 from . import finding(否则,在Python 3.5上,至少对我来说会引发SyntaxError)。 - Dolan Antenucci
我认为使用“from . import finding”更好,因为它不会硬编码目录名称,同时也避免了与另一个模块中可能存在的同名类的冲突。 - MinhajulAnwar
from .models import finding 也应该可以工作(至少对于Python 3.5)。 - Lazerbeak12345

3

显然,我可以这样做:from .finding import Finding,而且它能够正常工作。

下面的答案也反映了这一点,所以我想这是比较正确的。

我已经修复了文件命名,将我的测试移到了不同的目录,并且现在运行顺畅。谢谢!


3
在Python 3.7中无法运行。 - Wassadamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接