如何从Python中的其他文件夹导入模块?

问题描述 投票:4回答:4

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

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:尝试相对导入超出顶级包”。我在这做错了什么?如何从不同的目录导入文件,该目录不是子目录?

python python-3.x python-packaging
4个回答
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 .

0
投票

不幸的是,如果您的文件位于系统路径中,Python将只找到您的文件。但不要害怕!有一种解决方法!

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

你可以这样做:

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

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

祝好运!

约旦。


-1
投票

虽然上面的答案都是正确的,但我找到了另外一个答案,我想为完整性添加这些答案。显然,最初执行的脚本所在的目录及其子目录会自动添加到路径列表中。

这意味着如果你创建一个启动脚本(例如main.py)到你的项目root,稍后将执行所有其他模块(在我的情况下是api.py和backend.py)然后使用上面的方法

from models import some_model

将工作。


-2
投票

在这里回答:Importing files from different folder,有许多复杂的方法。您还可以使用:

进口OS

os.chdir('你的/新/目录“)

进口什么

这是非常不优雅,但做的工作。如果您需要更多上一个目录,请记得更改回来。

所有

© www.soinside.com 2019 - 2024. All rights reserved.