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

时间:2018-02-28 22:09:20

标签: python python-3.x python-packaging

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

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

4 个答案:

答案 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('你的/新/目录“)

导入任何

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

阿伦