我有一个我想这样构建的项目:
myproject
├── api
│ ├── __init__.py
│ └── api.py
├── backend
│ ├── __init__.py
│ └── backend.py
├── models
│ ├── __init__.py
│ └── some_model.py
└── __init__.py
现在,我想在api.py
和backend.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]
重要的是在导入文件之前导入并设置目录路径。
祝你好运!
乔丹。
我会列出两种方法:
只需通过绝对导入导入some_model
:
from myproject.models import some_model
请注意,myproject
应视为模块(即具有__init__.py
(
或
您可以将上一个路径添加到我在这种并行级别模块中使用的sys.path
:
import sys
sys.path.append('../')
from models import some_model