如何从不同的文件夹导入模块?

新手上路,请多包涵

我有一个项目,我想这样构建:

 myproject
├── api
│   ├── __init__.py
│   └── api.py
├── backend
│   ├── __init__.py
│   └── backend.py
├── models
│   ├── __init__.py
│   └── some_model.py
└── __init__.py

现在,我想在 api.pybackend.py 中导入模块 some_model.py 。我该如何正确地做到这一点?

我试过了:

 from models import some_model

但是失败了 ModuleNotFoundError: No module named 'models'

我也试过:

 from ..models import some_model

这给了我 ValueError: attempted relative import beyond top-level package

我在这里做错了什么?如何从不是子目录的不同目录导入文件?

原文由 Gasp0de 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

首先,这个导入声明:

 from models import some_model

应该命名空间:

 # in myproject/backend/backend.py or myproject/api/api.py
from myproject.models import some_model

然后你需要得到包含 myproject 的目录,让我们称之为 /path/to/parent ,进入 sys.path 您可以通过设置环境变量临时执行此操作:

 export PYTHONPATH=/path/to/parent

或者,最好是,您可以通过编写一个 setup.py 文件并安装您的包来实现。遵循 PyPA 打包指南。在您编写 setup.py 文件后,从同一目录中执行此命令以在 sys.path 中设置正确的条目:

 pip install --editable .

原文由 wim 发布,翻译遵循 CC BY-SA 4.0 许可协议

不幸的是,如果您的文件位于系统路径中,Python 只会找到您的文件。但不要害怕!有办法解决这个问题!

使用 python 的 sys 模块,我们可以在 Python 运行时向路径添加一个目录,一旦 Python 停止运行,它将从路径中删除它。

您可以通过以下方式做到这一点:

 import sys
sys.path.insert(0, '/path/to/application/app/folder')
import [file]

但是,在导入文件之前导入 sys 并设置目录路径很重要。

祝你好运!

约旦。

原文由 Jordan Mattiuzzo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题