我有一个项目,我想这样构建:
myproject
__init__.py
api
__init__.py
api.py
backend
__init__.py
backend.py
models
__init__.py
some_model.py
现在,我想在api.py和backend.py中导入some_model.py模块。我该如何正确地做到这一点? 我试过了
from models import some_model
但是失败的是“ModuleNotFoundError:没有名为'models'的模块”。 我也试过
from ..models import some_model
然后给了我“ValueError:尝试相对导入超出顶级包”。我在这做错了什么?如何从不同的目录导入文件,该目录不是子目录?
答案 0 :(得分:3)
首先,这个import语句声明:
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 .
答案 1 :(得分:0)
不幸的是,如果您的文件位于系统路径中,Python将只找到您的文件。但不要害怕!有一种解决方法!
使用python' sys
模块,我们可以在Python运行时向路径添加一个目录,一旦Python停止运行,它就会将其从路径中删除。
您可以通过以下方式执行此操作:
import sys
sys.path.insert(0, '/path/to/application/app/folder')
import [file]
在导入文件之前导入sys并设置目录路径非常重要。
祝你好运!约旦。
答案 2 :(得分:-1)
虽然上面的答案都是正确的,但我找到了另外一个答案,我想为完整性添加一些答案。 显然,最初执行的脚本所在的目录及其子目录会自动添加到路径列表中。
这意味着如果你为项目root创建一个启动脚本(例如main.py),稍后会执行所有其他模块(在我的情况下是api.py和backend.py),那么上面的方法使用
from models import some_model
会奏效。
答案 3 :(得分:-2)
在这里回答:Importing files from different folder,有许多复杂的方法。您也可以使用:
导入os
os.chdir('你的/新/目录“)
导入任何
这是非常不优雅,但做的工作。如果您需要更多来自上一个目录,请记得更改回来。
阿伦