【问题标题】:Can't import module from sibling directory无法从同级目录导入模块
【发布时间】:2015-12-23 19:12:01
【问题描述】:

我有一个结构如下的 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'This question 建议在每个目录中添加一个 __init__.py 文件,但没有帮助。 Another post说修改路径用:

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

但是当my_model 尝试从base_model 导入时,这会引发错误。

这看起来很简单,但我很难过。有人有什么想法吗?

【问题讨论】:

    标签: python python-3.x import


    【解决方案1】:

    将同级目录添加到sys.path 应该可以:

    import sys, os
    sys.path.insert(0, os.path.abspath('../models'))
    import my_model
    

    【讨论】:

      【解决方案2】:

      在任何地方都使用绝对导入:from project.models import my_model,应该可以在项目中的任何地方正常工作,也不需要弄乱路径。

      【讨论】:

      • 当我从 project.models 导入时,我仍然得到相同的 ImportError。我反复检查了根文件夹是否包含 __init__.py 和所有内容。
      • tests/ 也有__init__.py 吗?我现在注意到您的列表中缺少它。
      • 虽然我承诺不会弄乱路径,但您的项目目录的父目录应该在您的$PYTHONPATH(或sys.path.insert()it)中
      【解决方案3】:

      答案取决于您如何启动 test.py。 我知道进行相对导入的唯一方法是将文件放在一个包中。要让 Python 解释器知道你在一个包中,需要以某种方式导入它。

      用途:

      from ..models import my_model
      

      在 test.py 中

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

      然后您将能够正确导入 project.tests.test。

      【讨论】:

      • 我直接从命令行启动 test.py。当我尝试from ..models import my_model 时,它给了我一个错误Parent module '' not loaded, cannot perform relative import。我确保根目录有一个__init__.py 文件。
      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2015-12-22
      相关资源
      最近更新 更多