无法从兄弟目录导入模块

4

我有一个Python 3项目,结构如下:

/project
    __init__.py
    /models
        __init__.py
        my_model.py
        base_model.py
    /tests
        __init__.py
        test.py

test.py中,我想要导入my_model。我的第一次尝试是from models import my_model,但出现了ImportError: No module named 'models'的错误。这个问题建议在每个目录下添加一个__init__.py文件,但这并没有帮助。另一篇文章中提到需要使用以下代码修改路径:

import sys; import os
sys.path.insert(0, os.path.abspath('..'))

但是当my_model试图从base_model导入时会出现错误。
这似乎非常简单,但我却陷入了困境。有人有什么想法吗?
3个回答

1

在任何地方都使用绝对导入:from project.models import my_model,无论在项目的哪个位置,都可以正常工作,不需要更改路径。


当我从project.models导入时,我仍然遇到相同的ImportError错误。我三次检查了根文件夹是否有__init__.py文件和所有其他文件。 - serverpunk
1
“tests/” 目录下是否也有 “init.py” 文件?我现在注意到你的清单中缺少了它。 - proycon
虽然我承诺不要随意更改路径,但是您项目目录的父级应该在您的“$PYTHONPATH”中(或者使用“sys.path.insert()”将其插入)。 - proycon

1
答案取决于您如何启动test.py。我知道的唯一使用相对导入的方法是将文件放在一个包中。为了让Python解释器知道您正在使用包,需要以某种方式进行导入。
使用:
from ..models import my_model

在test.py文件中

并在项目文件夹下启动Python解释器。

这样你就能无错误地导入project.tests.test。


1
我直接从命令行启动test.py。当我尝试使用from ..models import my_model时,它会给出错误Parent module '' not loaded, cannot perform relative import。我确保根目录有一个__init__.py文件。 - serverpunk

1
将兄弟目录添加到sys.path应该可以实现:
import sys, os
sys.path.insert(0, os.path.abspath('../models'))
import my_model

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