news 2026/5/23 17:12:10

python导入基础概念解析及使用说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python导入基础概念解析及使用说明

python导入基础概念解析及使用说明

本文系统介绍了Python中导入模块的核心概念,包括目录/文件结构(模块、包、库、项目)、路径类型(绝对/相对)及实际应用场景。重点分析了绝对导入(推荐方式,基于项目根目录)和相对导入(基于当前文件位置)的差异,通过典型项目结构示例演示了两种导入方式的正确用法。

基本概念

先给出相关基本概念

• 文件夹/目录(Folder/Directory):一个操作系统级别的概念,用于存储文件和子文件夹。

• 相对和绝对(Absolute & Relative)路径:

- 对导入(Absolute Import):从项目的根目录(或 Python 的模块搜索路径 sys.path)开始,使用完整的模块路径进行导入。Python 3 已将绝对导入设为默认行为。

- 对导入(Relative Import):从当前模块所在的位置出发,通过相对路径(如 . 、 .. 、 ...)来导入同包或父包中的模块。

• 脚本(Script):单个 .py 文件,可以包含函数、类等定义,但主要目的是执行一些操作。

• 模块(Module):单个 .py 文件,可以包含函数、类、变量等定义,用于实现特定的功能。主要用于代码复用和组织,可以被其他脚本或模块导入使用。

• 程序(Program):一个或多个脚本或模块组成的一个整体,用于完成一个完整的任务或功能。程序可以是一个简单的脚本,也可以是一个复杂的项目。通常会通过主程序 main.py 启动,主程序负责协调各个模块的运行。

• 包(Package):一个文件夹/目录,但是目录必须中包含一个特殊的文件 __init__.py。包可以包含子包,形成层次结构。从Python 3.3 + 开始支持的“隐式命名空间包”无需__init__.py(PEP 420)

• 库(Library):一组模块或包的集合,通常用于实现特定的功能或功能集。库可以是标准库(Python 自带的库),也可以是第三方库(通过 pip 安装的库)。通常通过 import 语句导入使用。第三方库可以通过 pip 安装和管理。标准库有 math、os、sys 等。第三方库有 requests、numpy、pandas 等。

• 项目/工程(Project):一个包含多个文件和目录的完整开发任务,用于实现一个完整应用程序。

绝对导入 vs相对导入

绝对导入 (Absolute Import):

从项目根目录(或 sys.path 中的任何路径)开始的完整导入路径,与当前模块位置无关。

相对导入 (Relative Import):

以当前模块所在位置为基准,使用 . 表示相对位置的导入方式。

绝对导入是Python3的默认和推荐方式,相对导入是特殊场景下的备选。

对比:

方面

绝对导入

相对导入

起点

项目根目录/Python路径

当前文件所在位置

语法

完整包名

使用.和..

可移植性

较差(包名固定)

在包整体移动或重命名时,内部导入语句无需修改,具有一定灵活性。

运行方式

任何情况都可运行

只能作为模块运行(python -m)

清晰度

非常清晰

需要了解目录结构

示例:

假设项目结构如下:

项目:myapp/
├── __init__.py
├── run.py 主程序
├── core/
│ ├── __init__.py
│ ├── database.py
│ └── auth.py
└── utils/
├── __init__.py
├── logger.py
└── helpers.py
【注:从 Python 3.3 起引入了 隐式命名空间包(Implicit Namespace Packages),允许没有 __init__.py 的目录也被视为包。】

1. 在run.py中(通常用绝对导入):

import core.database # ✅ 绝对导入

from utils import logger # ✅ 绝对导入

# from .core import database # ❌ 错误!run.py不是包的一部分(如果直接运行)

【说明:为什么 import core.database 在 run.py 中能工作?

通常通过从项目根目录运行主程序(如 python run.py),此时当前目录自动加入 sys.path,使得顶层包可被导入。

当你运行一个具体脚本(如 python app.py),Python 会把 该脚本所在目录(不是你执行命令的目录!)加到 sys.path[0]。

sys.path[0] 是sys.path 列表的首项(索引为 0)表示“主脚本所在目录”或“当前工作目录”,具体取决于启动方式。sys.path 是 Python 解释器用于查找模块的路径列表,初始化顺序(优先级从高到低)大致为:

  • 被执行脚本所在的目录(绝对路径;若为 -c 或交互模式[注],则为 '',代表当前工作目录);
  • PYTHONPATH环境变量中指定的路径
  • 标准库路径(如 lib/python3.x);
  • 通过 .pth文件注册的路径
  • 第三方包安装目录(如 site-packages,包括虚拟环境、用户目录等)。

[注] 在命令行中可以使用 Python 的 -c 选项,直接执行一段 Python 代码字符串,而不是运行一个 .py 文件。例如:

python -c "print('Hello from -c!')"

交互模式”(Interactive Mode) 指Python 的 REPL(Read-Eval-Print Loop)环境。】

2. 在core/auth.py中:

方式1:绝对导入(推荐)
import core.database
from utils.logger import log_info

方式2:相对导入
from . import database # 同目录
from ..utils.logger import log_info # 父目录下的utils

3. 在utils/helpers.py中:

# 绝对导入:
from utils.logger import log_info # 同包内
from core.auth import authenticate # 不同包

# 相对导入:
from . import logger # 同目录
from ..core.auth import authenticate # 父目录下的core

常见问题及处理

项目目录结构:

myproject/
├── main.py
├── package1/
│ ├── __init__.py
│ ├── moduleA.py
│ └── subpackage1/
│ ├── __init__.py
│ └── moduleB.py
└── package2/
├── __init__.py
└── moduleC.py

问题1:相对导入在直接运行时报错
示例代码
在package1/moduleA.py中,我们使用相对导入来导入同目录下的subpackage1/moduleB.py:
# package1/moduleA.py
from .subpackage1 import moduleB

def function_a():
print("Function A")
moduleB.function_b()

如果我们直接运行moduleA.py,会得到如下错误:
$ python package1/moduleA.py
Traceback (most recent call last):
File "package1/moduleA.py", line 1, in <module>
from .subpackage1 import moduleB
ImportError: attempted relative import with no known parent package
原因
当直接运行一个脚本时,Python不会将其视为包的一部分,因此相对导入无法找到父包。
解决方案
将模块作为包的一部分运行:使用-m参数,从项目根目录开始指定模块路径:
python -m package1.moduleA

问题2:混合使用时的困惑
示例代码
假设在package2/moduleC.py中,我们需要使用package1/moduleA.py和package1/subpackage1/moduleB.py:
# package2/moduleC.py
# 混合使用绝对导入和相对导入(假设当前目录在Python路径中)
from package1 import moduleA # 绝对导入
from ..package1.subpackage1 import moduleB # 相对导入(错误!)

def function_c():
moduleA.function_a()
moduleB.function_b()
困惑之处:
1).可读性差:相对导入的路径可能不容易理解,特别是当目录层次较深时。
2).维护困难:如果移动了模块,相对导入可能需要调整,而绝对导入则可能需要更新包名。
建议:统一使用绝对导入,并确保项目根目录在Python路径中。
修改后的moduleC.py(统一使用绝对导入):
# package2/moduleC.py
from package1 import moduleA
from package1.subpackage1 import moduleB

def function_c():
moduleA.function_a()
moduleB.function_b()

附录

python之import语句的用法https://blog.csdn.net/cnds123/article/details/118437585

模块 https://blog.csdn.net/cnds123/article/details/141606921

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 13:36:32

Open-AutoGLM批量任务处理全攻略(企业级自动化落地秘籍)

第一章&#xff1a;Open-AutoGLM批量任务处理的核心价值在大规模自然语言处理场景中&#xff0c;自动化与高效性是系统设计的关键。Open-AutoGLM 作为一款面向 GLM 系列模型的批量任务调度框架&#xff0c;其核心价值体现在对异构任务的统一管理、资源的智能分配以及执行流程的…

作者头像 李华
网站建设 2026/5/3 18:55:54

揭秘Open-AutoGLM批量任务卡顿难题:3步实现性能翻倍提升

第一章&#xff1a;揭秘Open-AutoGLM批量任务卡顿难题&#xff1a;3步实现性能翻倍提升在高并发场景下&#xff0c;Open-AutoGLM 处理批量任务时常出现响应延迟、资源争用等问题&#xff0c;严重影响推理吞吐量。通过系统性优化策略&#xff0c;可显著缓解卡顿现象&#xff0c;…

作者头像 李华
网站建设 2026/5/19 19:39:17

揭秘Open-AutoGLM定时任务配置难点:3步实现零误差任务调度

第一章&#xff1a;Open-AutoGLM定时任务配置概述Open-AutoGLM 是一个面向自动化大语言模型任务调度的开源框架&#xff0c;支持灵活的定时任务配置&#xff0c;适用于模型推理、数据预处理与结果推送等场景。通过集成标准的调度引擎与模块化任务接口&#xff0c;用户可高效管理…

作者头像 李华
网站建设 2026/5/22 14:49:29

进程异常频发怎么办,Open-AutoGLM智能管控全解析

第一章&#xff1a;进程异常频发怎么办&#xff0c;Open-AutoGLM智能管控全解析在现代分布式系统中&#xff0c;进程异常频发是影响服务稳定性的常见问题。Open-AutoGLM 作为一款智能化的运行时管控框架&#xff0c;通过动态监控、异常预测与自动恢复机制&#xff0c;有效应对进…

作者头像 李华
网站建设 2026/5/22 18:49:25

Open-AutoGLM资源占用监控实战(专家级调优指南)

第一章&#xff1a;Open-AutoGLM资源占用监控概述在部署和运行 Open-AutoGLM 这类基于大语言模型的自动化推理系统时&#xff0c;资源占用情况直接影响服务稳定性与响应效率。实时监控 GPU 显存、CPU 使用率、内存消耗及网络 I/O 等关键指标&#xff0c;是保障系统高效运行的基…

作者头像 李华