自学内容网 自学内容网

from……import……

假设你的项目结构如下:

project/
│
├── main_folder/
│   ├── __init__.py
│   ├── main_script.py
│   └── sub_folder/
│       ├── __init__.py
│       └── module_to_import.py
│
└── other_folder/
    └── ...

在这个结构中,main_script.py 位于 main_folder 目录下,并且你想要从 main_script.py 中导入 module_to_import.py,这个模块位于 main_folder 下的 sub_folder 目录中。

在 main_script.py 文件中,你可以使用以下代码进行相对导入:

# 在 main_script.py 文件中
from .sub_folder import module_to_import

# 现在你可以使用 module_to_import 中的功能
module_to_import.some_function()

这里的路径写法解释如下:

  • .: 表示当前目录,即 main_folder
  • sub_folder: 是相对于当前目录(main_folder)的子目录。
  • module_to_import: 是你想要导入的模块名。

这个相对导入的工作方式是基于当前执行的模块(在这个例子中是 main_script.py)的路径。当你运行 main_script.py 时,Python 解释器会查找相对于 main_folder 的 sub_folder 目录下的 module_to_import.py 模块。

为了使相对导入正常工作,main_folder 必须被视为一个包,这意味着它必须包含一个 __init__.py 文件,这个文件可以是空的,但必须存在。同样,sub_folder 也需要包含一个 __init__.py 文件。

假设你的项目结构如下:

project/
│
├── a/
│   ├── __init__.py
│   └── b/
│       ├── __init__.py
│       └── c.py
│
└── other_folder/
    └── ...

如果你在 project 目录下的某个Python脚本中想要导入 a/b/c.py 中的模块,你可以按照以下方式编写导入语句:

  1. 如果你在 a 文件夹下的某个脚本中导入 c.py

python

复制

# 假设你在 a 文件夹下的 script_in_a.py 中
from .b import c
  1. 如果你在 project 目录下的某个脚本中导入 c.py

python

复制

# 假设你在 project 目录下的 script_in_project.py 中
from a.b import c
  1. 如果你在 other_folder 目录下的某个脚本中导入 c.py

# 假设你在 other_folder 目录下的 script_in_other_folder.py 中
from ..a.b import c

这里的关键点是:

  • . 表示当前目录。
  • .. 表示上级目录。
  • a 和 b 是目录名。
  • c 是模块名,对应于 c.py 文件。

确保 a 和 b 目录都包含一个 __init__.py 文件,这样Python才能将它们识别为包。__init__.py 文件可以是空的,但它必须存在。

此外,如果你正在直接运行一个脚本而不是将其作为模块导入,你可能需要修改 sys.path 来包含 project 目录的路径,这样Python才能找到 a 包。例如:

python

复制

import sys
from pathlib import Path

# 假设 script_in_project.py 位于 project 目录下
project_dir = Path(__file__).resolve().parent
sys.path.append(str(project_dir))

# 现在可以导入 c 模块
from a.b import c

如果你的项目结构如下:

复制

project/
│
├── a/
│   ├── __init__.py
│   └── b/
│       ├── __init__.py
│       └── d/
│           ├── __init__.py
│           └── c.py
│
└── other_folder/
    └── ...

那么,根据你所在的文件位置,你可以使用以下几种方式来导入 c.py 模块:

1. 如果你正在 project 目录下的某个脚本中导入 c.py

python

复制

# 假设你在 project 目录下的 script_in_project.py 中
from a.b.d import c

2. 如果你正在 a 文件夹下的某个脚本中导入 c.py

python

复制

# 假设你在 a 文件夹下的 script_in_a.py 中
from .b.d import c

3. 如果你正在 b 文件夹下的某个脚本中导入 c.py

python

复制

# 假设你在 b 文件夹下的 script_in_b.py 中
from .d import c

4. 如果你正在 d 文件夹下的某个脚本中导入 c.py

python

复制

# 假设你在 d 文件夹下的 script_in_d.py 中
from . import c

注意事项:

  • 确保每个文件夹(abd)都包含一个 __init__.py 文件,这个文件可以是空的,但必须存在,以便Python将这些文件夹视为包。
  • 如果你在项目外部的脚本中尝试导入 c.py,你可能需要将项目根目录(即 project/)添加到 sys.path 中,如前面的示例所示。

使用相对导入时,. 表示当前目录,.. 表示上级目录,以此类推。根据你的脚本位置,使用适当的相对路径来导入 c.py

 

在Python中进行绝对导入时,你需要指定从项目的根目录到目标模块的完整路径。绝对导入不考虑当前文件的位置,而是从项目的顶级包开始导入。

以下是进行绝对导入的步骤:

  1. 确保你的项目是一个包:你的项目根目录应该包含一个 __init__.py 文件,使其成为一个可导入的包。

  2. 设置 PYTHONPATH:你需要确保Python解释器的 PYTHONPATH 包含你的项目根目录。这可以通过以下几种方式完成:

    • 在命令行中设置 PYTHONPATH 环境变量:

      bash

      复制

      export PYTHONPATH=$PYTHONPATH:/path/to/your/project
      
    • 在Python代码中修改 sys.path

      python

      复制

      import sys
      sys.path.append("/path/to/your/project")
      
  3. 执行绝对导入:在代码中,你可以直接从顶级包开始导入模块。

假设你的项目结构如下:

复制

project/
│
├── a/
│   ├── __init__.py
│   └── b/
│       ├── __init__.py
│       └── d/
│           ├── __init__.py
│           └── c.py
│
└── other_folder/
    └── ...

以下是如何从项目中的任何位置进行绝对导入 c.py 的示例:

python

复制

# 在任何Python脚本中
from a.b.d import c

为了使上述绝对导入工作,你需要确保:

  • project 目录是顶级包,并且包含一个 __init__.py 文件。
  • PYTHONPATH 环境变量已经包含了 project 目录的路径,或者你已经通过修改 sys.path 在代码中添加了这个路径。

如果你正在从命令行运行脚本,并且该脚本位于项目根目录下,通常不需要修改 PYTHONPATH,因为Python会自动将当前目录添加到 sys.path 中。但如果你的脚本位于项目之外,或者你需要从其他包或模块中导入,那么设置 PYTHONPATH 或修改 sys.path 就是必要的。

绝对导入的优点是它提供了清晰的模块路径,不容易受到当前工作目录的影响,这使得代码更加可读和可维护。然而,它要求项目结构必须固定,且 PYTHONPATH 必须正确设置。


原文地址:https://blog.csdn.net/m0_68339197/article/details/143894777

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!