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
中的模块,你可以按照以下方式编写导入语句:
- 如果你在
a
文件夹下的某个脚本中导入c.py
:
python
复制
# 假设你在 a 文件夹下的 script_in_a.py 中
from .b import c
- 如果你在
project
目录下的某个脚本中导入c.py
:
python
复制
# 假设你在 project 目录下的 script_in_project.py 中
from a.b import c
- 如果你在
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
注意事项:
- 确保每个文件夹(
a
,b
,d
)都包含一个__init__.py
文件,这个文件可以是空的,但必须存在,以便Python将这些文件夹视为包。 - 如果你在项目外部的脚本中尝试导入
c.py
,你可能需要将项目根目录(即project/
)添加到sys.path
中,如前面的示例所示。
使用相对导入时,.
表示当前目录,..
表示上级目录,以此类推。根据你的脚本位置,使用适当的相对路径来导入 c.py
。
在Python中进行绝对导入时,你需要指定从项目的根目录到目标模块的完整路径。绝对导入不考虑当前文件的位置,而是从项目的顶级包开始导入。
以下是进行绝对导入的步骤:
-
确保你的项目是一个包:你的项目根目录应该包含一个
__init__.py
文件,使其成为一个可导入的包。 -
设置
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")
- 在命令行中设置
-
执行绝对导入:在代码中,你可以直接从顶级包开始导入模块。
假设你的项目结构如下:
复制
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)!