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