📌  相关文章
📜  python 从不同目录导入文件 - Python (1)

📅  最后修改于: 2023-12-03 14:46:12.008000             🧑  作者: Mango

Python 从不同目录导入文件

在 Python 中,我们经常需要在项目中从不同的目录中导入模块或文件,比如从上级目录中导入模块或文件、从其他模块中导入模块或文件等等。本文将介绍如何在 Python 中从不同目录导入文件。

方法一:使用相对导入

相对导入使用相对路径从当前目录导入模块或文件,使用相对导入可以避免由于不同操作系统的路径差异导致的问题。

举个例子,假设我们有以下的文件结构:

project/
├── app/
│   ├── __init__.py
│   └── main.py
├── tasks/
│   ├── __init__.py
│   └── task.py
└── utils/
    ├── __init__.py
    └── util.py

我们需要在 main.py 中导入 task.py ,并在 task.py 中导入 util.py ,那么可以使用相对导入,代码如下:

# main.py
from ..tasks import task

# task.py
from ..utils import util

注意事项:

  • 相对导入只能在 package 内使用。
  • 相对导入必须使用 ... 开头。
  • 相对导入不能使用绝对路径。
方法二:使用 sys.path

sys.path 是 Python 解释器的搜索路径,它是一个列表,存储每个搜索路径。因此,我们可以通过修改 sys.path 列表,添加需要搜索的路径,以便在不同的目录中导入模块或文件。

举个例子,假设我们有以下的文件结构:

project/
├── app/
│   ├── __init__.py
│   └── main.py
├── tasks/
│   ├── __init__.py
│   └── task.py
└── utils/
    ├── __init__.py
    └── util.py

我们需要在 main.py 中导入 task.py ,并在 task.py 中导入 util.py ,如果不想使用相对导入,可以像下面这样修改 sys.path 列表:

# main.py
import sys
sys.path.append('../tasks')

from task import Task

# task.py
import sys
sys.path.append('../utils')

from util import Util

注意事项:

  • 修改 sys.path 列表可能会影响到其他模块。
  • 修改 sys.path 列表需要谨慎,避免出现路径冲突等问题。
方法三:使用包名

当我们在 Python 中导入模块或文件时,会先在当前目录中查找对应的模块或文件,如果没有找到,则会到 sys.path 中查找。因此,我们可以通过将不同目录下的文件打包成一个 package 来解决问题。

举个例子,假设我们有以下的文件结构:

project/
├── app/
│   ├── __init__.py
│   └── main.py
├── tasks/
│   ├── __init__.py
│   └── task.py
└── utils/
    ├── __init__.py
    └── util.py

我们可以将 tasksutils 目录下的文件打包成一个 package ,如下:

project/
├── app/
│   ├── __init__.py
│   └── main.py
├── mypackage/
│   ├── __init__.py
│   ├── tasks/
│   │   ├── __init__.py
│   │   └── task.py
│   └── utils/
│       ├── __init__.py
│       └── util.py

然后在 main.py 中导入 Task 类,代码如下:

# main.py
from mypackage.tasks import Task

task = Task()
task.run()

task.py 中导入 Util 类同理。

注意事项:

  • package 的结构必须符合 Python 的规则。
  • package 的名称必须是一个合法的 Python 标识符,不能使用 Python 的关键字。
  • package 的 init.py 文件是一个必须存在的文件,如果没有 init.py 文件,则该目录不会被认为是一个 package。