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

How to import a module from a different folder?

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

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.

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

首先,这个导入语句:

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 .

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

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

您可以通过以下方式完成此操作:

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

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

祝你好运!

约旦。

我会列出两种方法:

通过绝对导入简单地导入some_model

from myproject.models import some_model

请注意 myproject 应被视为一个模块(即具有 __init__.py


您可以将之前的路径添加到我在此类并行级别模块中使用的sys.path

import sys
sys.path.append('../')

from models import some_model