news 2026/1/13 11:49:23

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/1/12 22:32:11

探索三相两电平光伏逆变器DC - AC部分的Simulink仿真之旅

三相两电平光伏逆变器dcac部分&#xff0c;simulink仿真&#xff0c;电压电流双闭环控制&#xff0c;空间矢量调制&#xff08;svpwm&#xff09;在光伏逆变器的领域中&#xff0c;三相两电平逆变器是常见且重要的存在&#xff0c;其中DC - AC部分实现了直流到交流的关键转换。…

作者头像 李华
网站建设 2026/1/11 16:59:31

【AI推理服务稳定性提升】:基于Open-AutoGLM的后台运行配置最佳实践

第一章&#xff1a;Open-AutoGLM 后台运行概述Open-AutoGLM 是一个基于 AutoGLM 架构的开源自动化语言模型服务平台&#xff0c;支持在本地或云端长时间后台运行&#xff0c;适用于持续推理、任务调度与API服务部署等场景。为确保服务稳定性与资源利用率&#xff0c;合理配置其…

作者头像 李华
网站建设 2026/1/7 16:19:24

Open-AutoGLM网络配置避坑指南(一线专家亲授12年实战经验)

第一章&#xff1a;Open-AutoGLM网络配置优化概述在部署和运行 Open-AutoGLM 模型服务时&#xff0c;网络配置的合理性直接影响模型推理的响应速度、吞吐能力和整体稳定性。合理的网络优化策略不仅能降低延迟&#xff0c;还能提升多节点协同训练与推理的效率。核心优化目标 最小…

作者头像 李华
网站建设 2026/1/11 13:33:32

Open-AutoGLM报错代码怎么破:从日志到修复的7步闭环流程

第一章&#xff1a;Open-AutoGLM 报错代码查询在使用 Open-AutoGLM 框架进行大模型自动化推理时&#xff0c;开发者常会遇到各类运行时错误。准确识别并解析报错代码是快速定位问题的关键。本章将介绍常见报错类型、其底层成因及对应的排查策略。常见报错类型与含义 ERR_MODEL_…

作者头像 李华
网站建设 2026/1/2 15:31:04

实时交互不是梦:Linly-Talker构建高响应数字人系统

实时交互不是梦&#xff1a;Linly-Talker构建高响应数字人系统 在虚拟主播直播带货、AI客服24小时在线答疑的今天&#xff0c;你有没有想过——那个面带微笑、口型精准、语气自然的“数字人”&#xff0c;是如何做到边听边想、边说边动的&#xff1f;过去&#xff0c;这类形象依…

作者头像 李华
网站建设 2026/1/12 14:36:50

从沉默到透明:Open-AutoGLM运行日志开启全流程深度解析

第一章&#xff1a;从沉默到透明&#xff1a;Open-AutoGLM日志开启的意义在系统开发与运维过程中&#xff0c;日志是洞察程序行为的核心工具。Open-AutoGLM 作为自动化生成式逻辑模型的开源框架&#xff0c;其默认配置倾向于“沉默运行”&#xff0c;以减少输出干扰。然而&…

作者头像 李华