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

2024-03-28 19:04:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我想这样组织:

myproject
  __init__.py
  api
    __init__.py
    api.py
  backend
    __init__.py
    backend.py
  models
    __init__.py
    some_model.py

现在,我想在api.py和backend.py中导入模块model.py。我该怎么做? 我试过了

from models import some_model

但这失败了,因为“ModuleNotFoundError:No module named'models'”。 我也试过了

from ..models import some_model

然后它给了我“ValueError:试图在顶级包之外进行相对导入”。我在这里做错什么了?如何从不同的目录(不是子目录)导入文件?


Tags: 模块项目nofrompyimportapibackend
3条回答

不幸的是,Python只有在文件位于系统路径中时才能找到您的文件。但不要害怕!这是有办法的!

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

您可以通过以下方式执行此操作:

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

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

祝你好运!

约旦。

虽然上面的答案都是对的,但我又找到了一个答案,为了完整起见,我想补充一下。 显然,最初执行的脚本所在的目录及其子目录会自动添加到路径列表中。

这意味着,如果您创建了一个项目根目录的开始脚本(例如main.py),该脚本稍后将执行所有其他模块(在我的例子中是api.py和backend.py),那么上面的方法使用

from models import some_model

会有用的。

首先,这个导入语句:

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 .

相关问题 更多 >