【问题标题】:ModuleNotFoundError when attempting to import from outside of directory尝试从目录外部导入时出现 ModuleNotFoundError
【发布时间】:2017-01-31 17:09:20
【问题描述】:

我正在开发一个 Flask 应用程序并尝试运行我的测试文件,但无法这样做。我目前的应用结构是:

Project
── app
│   ├── __init__.py
│   ├── forms.py
│   ├── model.py
│   ├── models.py
│   ├── static
│   │   ├── css
│   │   ├── fonts
│   │   ├── img
│   │   ├── js
│   │   └── uploads
│   ├── templates
│   │   ├── client
│   │   │   ├── client-base.html
│   │   │   ├── client-inventory.html
│   │   │   ├── client-login.html
│   │   │   ├── client-macros.html
│   │   │   ├── client-main.html
│   │   │   └── client-signup.html
│   │   └── user
│   │       ├── user-base.html
│   │       ├── user-macros.html
│   │       └── user-main.html
│   └── views
│       ├── __init__.py
│       ├── client.py
│       └── user.py
├── config.py
├── run.py
└── tests
    └── test_user_model.py

当我尝试在test_user_model.py 中运行from app.models import User 时,它会引发ModuleNotFoundError: No module named 'app'。我尝试过无数种不同的方式编辑导入语句,但在每种情况下它仍然会引发错误(from ..app import models 超出范围,import app 和类似的导入也不起作用。)

【问题讨论】:

  • 你从哪个文件夹运行这个?

标签: python python-3.x flask python-import relative-path


【解决方案1】:

您应该在您的tests 目录中添加__init__.py。空的__init__.py 将把那个目录变成一个包。然后你可以在你的test_user_model.py 中使用这一行:

from app.models import User

详见PEP 328。

【讨论】:

  • 您能否说明在何处“使用”该导入语句,以及__init__.py 的工作原理?
  • @colllin 抱歉耽搁了。
【解决方案2】:

您需要在您的PYTHONPATH 中添加app

【讨论】:

  • 你确定吗?从目录外部导入模块似乎并不难,我之前已经多次看到它无需编辑PYTHONPATH - 即使在official flask practice application 中,测试只需调用from flaskr import flaskr 即可导入应用程序
  • 您可以通过导出环境变量将模块添加到python路径中,也可以在代码中进行。
  • 但是我很困惑,为什么当其他项目能够毫无问题地从不同目录导入模块时,我需要更改 python 路径?
  • 您可以在测试脚本中进行本地更改。
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2019-07-03
  • 1970-01-01
  • 2021-07-12
  • 2022-11-12
相关资源
最近更新 更多