绝对 import 还是相对 import?一文讲清怎么选

Python模块化编程:从import机制到项目实战的完整指南 在软件开发中,模块化是提升代码可维护性和可读性的核心原则。Python通过import机制实现模块化,其原理是解释器按照sys.path路径搜索模块文件,编译并执行其顶层代码,最终创建模块对象供调用。这一机制的价值在于支持代码复用、分离关注点,并促进团队协作。在实际工程中,模块化技术广泛应用于构建可扩展的应用程序架构,例如数据分析管道、Web后端服务和插件系统。本文聚焦Python跨文件调用,深入解析import的四种方式及其适用场景,对比相对导入与绝对导入的差异,并通过一个完整的数据分析项目实例,展示如何 阅读详情

前篇:Python Import 为什么报错?搞懂 sys.path 就明白了

​ 上一篇我们知道了 Python 通过 sys.path 找模块。但 import 语句本身也有两种写法:绝对 import 和 相对 import,选错了同样会报错。

​ 这篇讲清楚三件事:两种 import 的区别、怎么选、__init__.py 要不要加。

一、绝对 import:从根目录写完整路径

from utils.helpers import clean_data

​ 这就是绝对 import。Python 会拿着 utils.helpers 这个路径,依次到 sys.path 的每个目录下去找 utils/helpers.py。

​ 就像写文件的绝对路径一样,不管你当前在哪个目录,路径都从根开始写。这里的"根"就是 sys.path 里的某个目录。

my_project/          ← sys.path 中包含这个目录
├── core/
│   └── engine.py    ← 在这里写 import
└── utils/
    └── helpers.py   ← 要 import 的目标
# core/engine.py
from utils.helpers import clean_data    # 从 my_project/ 开始找

​ 只要 my_project/ 在 sys.path 里,这个 import 就能成功。跟 engine.py 在哪个子目录无关。

二、相对 import:从当前文件位置出发

from ..utils.helpers import clean_data

​ 开头的 . 表示"从我这个文件所在的位置出发":

  • . = 当前包(当前目录)

  • .. = 上一层包(父目录)

  • ... = 上两层包

    就像文件的相对路径,../utils/helpers.py 表示"先回到上一层,再进入 utils 目录"。

# core/engine.py

from .models import User              # 同一个包内:core/models.py
from ..utils.helpers import clean_data  # 上一层再进 utils:utils/helpers.py

三、相对 import 的限制

​ 相对 import 有一个致命限制:只能在包内使用。

  • 什么叫"包内"?满足两个条件:

    • 文件所在目录有 __init__.py
    • 文件是被 import 的,或者通过 python -m 运行的
  • 如果你直接运行一个使用了相对 import 的文件:

    python core/engine.py
    # ImportError: attempted relative import with no known parent package
    

​ 这个报错的意思是:你把 engine.py 当作独立脚本运行了,Python 不知道它属于哪个包,.. 无法解析。

  • 解决方法:用 python -m 运行:

    cd my_project
    python -m core.engine    # ✅ Python 知道 engine 属于 core 包
    

四、到底选哪种?

​ 大多数情况下,用绝对 import。 理由很简单:

绝对 import相对 import
可读性一眼看出目标模块在哪要数 . 的个数,心算目录层级
移动文件后不用改(只要包结构没变)可能要改(相对位置变了)
直接运行都不太行,但报错更直观报错更让人困惑
推荐场景默认选择包内紧密耦合的模块之间

​ Python 官方风格指南(PEP 8)也推荐优先使用绝对 import。

​ 相对 import 适合的场景:一个包内部的模块互相引用,并且你希望整个包被移动或重命名时不用改内部的 import。比如:

# core/engine.py
from .models import User       # core 包内部引用,用相对 import 合理
from .config import settings   # 同上

五、__init__.py:到底要不要加?

​ 每个"包"目录下都建议放一个 __init__.py:

my_project/
├── core/
│   ├── __init__.py    ← 这个文件
│   ├── engine.py
│   └── models.py
└── utils/
    ├── __init__.py    ← 和这个文件
    └── helpers.py

​ 它可以是空文件,但建议加上。

5.1 不加会怎样?

​ Python 3.3+ 支持"命名空间包"(namespace packages),理论上不需要 __init__.py 也能 import。但实际开发中,不加会遇到这些问题:

  • PyCharm 可能不识别这个目录为包,代码补全和跳转失效
  • pytest 在某些配置下找不到测试模块
  • 相对 import 会失败,Python 不确定这个目录是不是一个包
  • 更隐蔽的问题:有些 import 方式会静默失败,不报错但 import 到的不是你想要的东西

5.2 建议增加

​ 每个包目录都加一个 __init__.py,哪怕是空的。 零成本,省掉一类排查困难的问题。

# utils/__init__.py
# 空文件,仅标识这是一个 Python 包

​ 如果你想在 import utils 时直接暴露一些常用接口,可以在 __init__.py 里写:

# utils/__init__.py
from .helpers import clean_data, format_output

​ 这样外部可以直接 from utils import clean_data,不用写完整路径。

六、总结

  1. 绝对 import 是默认选择:路径清晰,不容易出错
  2. 相对 import 适合包内部:同一个包的模块之间互相引用时可以用
  3. 相对 import 只能在包内使用,直接 python file.py 运行一定报错,要用 python -m
  4. 每个包目录加 __init__.py,空文件就行,能避免一堆隐晦问题
SV DPI接口避坑指南:从‘import/export‘语法到VCS编译,一次讲清那些让人头疼的细节 本文详细解析了SystemVerilog DPI接口的常见问题与解决方案,包括import/export语法细节、VCS编译流程陷阱、数据交互安全操作等。特别针对SV DPI接口中的context关键字使用、头文件包含顺序、多仿真器兼容性等关键点提供实战指南,帮助开发者高效避坑并提升开发效率。 阅读详情

相关推荐

STM32CubeIDE外部文件链接与路径管理:打破绝对路径失效难题

嵌入式开发中,多工程复用公共驱动代码是常见需求。在STM32CubeIDE(基于Eclipse CDT)中,通过链接文件将外部源文件引入工程,可实现文件级复用,避免复制多份副本带来的同步负担。其原理是工程内创建指向磁盘外部路径的虚拟条目,编译时读取原文件内容,类似云端照片的本地可见但实际存储于他处。但链接后的路径管理尤为关键,直接使用绝对路径会导致换机后链接失效,而路径变量和${PROJECT_LOC}相对路径方案能显著提升工程可移植性和团队协作稳定性。同时,头文件搜索路径需单独配置,否则编译器将报No s

weixin_34252686的博客 324

Python Import 详解

import绝对是我们在使用python时最常用的语句之一了,但其实关于import,需要注意的地方还真不少,如导入第三方库,导入自己写的库,导入相对路径下文件中的方法,在包内部的相对与绝对导入等导入源;有导入的顺序;有Lazy Load惰性导入方法;有已经导入后的重载等等。本文就旨在讲清楚这些问题,并提供足够的示例以供参考。 Import已安装的第三方库 import <PKG> import <PKG> as <ABBR> from <PKG> i.

ytp552200ytp的博客 833

Python从入门到精通(第19章):模块、包与导入机制

本章围绕“模块、包与导入机制”展开。模块是独立的命名空间,导入是把模块名字引入当前文件的操作。import有多种写法(),每种写法在命名空间上有不同的影响。本章会讲清楚import的执行过程、循环导入的成因与解决方式、__all__的作用、以及如何组织一个可发布的包。

zhaoyang4298的博客 200

python import_Python Import 详解

import绝对是我们在使用python时最常用的语句之一了,但其实关于import,需要注意的地方还真不少,如导入第三方库,导入自己写的库,导入相对路径下文件中的方法,在包内部的相对与绝对导入等导入源;有导入的顺序;有Lazy Load惰性导入方法;有已经导入后的重载等等。本文就旨在讲清楚这些问题,并提供足够的示例以供参考。Import已安装的第三方库import import as from...

weixin_39650745的博客 327

实用电路精讲系列---快速精密桥式放大器电路

快速精密桥式放大器通过惠斯通电桥转换物理量为差分信号,经仪表放大器精密放大,具有高共模抑制、低噪声和宽带宽特性。其核心包含:电桥传感器转换、仪表放大器信号调理(增益可调、温漂补偿)、输出级适配ADC。典型应用包括智能断路器监测、胎压检测、电池安全预警等10大领域,需注意传感器-放大器-ADC最短路径布局。实用电路采用LT1057S和LT1010构建,实现稳定供电、差分处理、功率放大和桥式驱动,满足高精度、快速响应需求。该技术在工业控制、医疗设备等领域具有重要价值。

weixin_40590799的博客 1413

Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题

本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存与性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。

weixin_28693309的博客 147

GetFullPath函数详解:从相对路径到绝对路径的跨平台实践

在软件开发中,文件路径处理是基础且关键的技术环节。相对路径依赖于当前工作目录,具有不确定性,容易导致程序在不同环境下运行失败。绝对路径则提供了系统内唯一的文件定位标识,是构建稳定文件访问的基础。通过路径解析函数,可以将相对路径转换为确定的绝对路径,从而建立稳定的文件访问坐标系,这是编写健壮、可移植代码的基本功。在工程实践中,无论是C#的Path.GetFullPath、Python的os.path.abspath还是Node.js的path.resolve,其核心原理相通,都用于解决文件I/O、配置加载和资

weixin_38166557的博客 362

Cadence Allegro 17.4学习记录开始00

Cadence Allegro 有三个版本,16.6,17.2,17.4。现在主要学习最新的版本17.4.原理图设计:OrCADPCB设计:Allegro主要用到的就下面三个图片软件:PCB Editor 17.4 是用来画PCB和元器件封装的;Padstack Editor 17.4 是用来画元器件焊盘的;Capture CIS 17.4 是用来画原理图和原理图库的。其实Cadence还有很多功能,现在计划先学习以上内容,后面熟悉了这个软件,还可以继续学习放仿真等功能。

qq_31444421的博客 7438

python import re_Python Import 详解

import绝对是我们在使用python时最常用的语句之一了,但其实关于import,需要注意的地方还真不少,如导入第三方库,导入自己写的库,导入相对路径下文件中的方法,在包内部的相对与绝对导入等导入源;有导入的顺序;有Lazy Load惰性导入方法;有已经导入后的重载等等。本文就旨在讲清楚这些问题,并提供足够的示例以供参考。Import已安装的第三方库import import as from...

weixin_39681058的博客 320

NE555构成多谐振荡器及三角波、正弦波的生成(附工程文件)

NE555构成多谐振荡器及三角波、正弦波的生成 续上一篇:NE555基本原理及相关公式的推导

qq_49979053的博客 5万+

YOLOv11 网络结构详解:一文看懂 Backbone、Head、C3k2、SPPF 和 Detect 检测头

在使用 YOLOv11 进行目标检测时,我们经常会接触到或这样的模型配置文件。backbone和head分别是什么意思?ConvC3k2SPPFC2PSA这些模块分别起什么作用?P3/8、P4/16、P5/32 代表什么?为什么最后 Detect 要同时接收 3 个不同尺度的特征图?YOLOv11n、YOLOv11s、YOLOv11m、YOLOv11l、YOLOv11x 的区别在哪里?

learnerYC的博客 1807

PyCharm 里 import 不报错,运行却失败?Sources Root 的锅

PyCharm的import问题源于编辑器与运行时使用两套独立路径系统。Sources Root是关键配置,需手动标记代码目录(如src/)以对齐两套系统。常见项目结构中,平铺式最简单,带子包或src/布局需额外设置。推荐正式项目使用pip install -e .安装为可编辑包,彻底解决路径问题。排查时优先检查sys.path是否包含目标目录。PyCharm开发时,Sources Root与运行配置的Working Directory需正确设置,避免编辑器无报错但运行失败的情况。

Rabbit_QL的博客 269

ETAP实战:如何用仿真软件快速绘制标准一次接线图(附模板下载)

本文提供了一套基于ETAP软件高效绘制标准一次接线图的完整实战工作流。从国标符号库配置、绘图模板创建,到核心设备绘制、参数标注,再到利用软件模型进行拓扑检查与短路电流校核,手把手教你实现从零到一的专业图纸设计。文末附有实用模板下载,助你大幅提升电力设计效率与图纸质量。

weixin_29291573的博客 509

UnoCSS Node 23 翻车?一次讲清

UnoCSS 65.5.0 起,Astro 项目在 Windows + Node.js 23 下启动即炸,ERR_UNSUPPORTED_ESM_URL_SCHEME 直接砸脸。这篇讲清报错来路与两条出路。 ## 📍 现场还原:报错全文与触发条件 astro dev 一敲,终端甩出完整报错: ``` Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only

gitblog_01087的博客 325

Lammps模拟剪切作用下的位错滑移

Lammps模拟位错与障碍物作用。在lammps中实现周期性位错阵列模型模拟剪切作用下1/2刃位错与障碍物的交互作用

Rockyoung 3457

set_input_delay/set_output_delay介绍

针对这一类的情况,在做block时,cts之后,便需要将update_io_latency给关闭。那么,计算的timing就是错误的了。对于hier flow来讲,切分block,进行timing budget的时候,clock tree还未长。计算block端口上的timing,通常需要用到set_input_delay和set_output_delay告知工具外部电路的延迟信息,以方便工具计算端口上的timing。此时,工具在计算in2reg的timing时,便会将2.67ns的delay带进来。

芯冰乐 316

Python模块与包全解析:从import机制到项目结构设计

在Python工程实践中,模块(Module)与包(Package)是组织代码的基础单元,也是理解import机制与命名空间隔离的关键。模块作为一个.py文件天然形成独立命名空间,避免变量冲突并提升复用性;包则通过目录结构将模块层次化,配合__init__.py实现更清晰的项目组织。import语句背后涉及sys.path查找、模块缓存与字节码加载等完整流程,理解这些原理能帮助开发者快速定位导入报错、循环依赖和同名覆盖等高频问题。在实际项目里,合理划分模块边界、使用相对导入还是绝对导入、以及如何设计可维护的

weixin_33806859的博客 236

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

09 · 模块与包:理解 import 与生态

seo_title: Python模块与包教程:import机制与第三方库生态seo_description: 零基础学Python模块与包:import的几种写法、__init__.py、if __name__ == "__main__"、sys.path查找顺序,以及用uv/pip安装第三方库和常见导入避坑。seo_keywords: Python模块, Python包, import, __init__.py, pip, uv, PyPI。

大衛說 158

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python相对导入错误解析:从模块系统原理到项目结构最佳实践

Python模块系统是构建可维护项目的基石,理解模块、包和导入机制对于开发者至关重要。其核心原理基于sys.path搜索路径和模块的__name__、__package__属性,决定了代码的组织和复用方式。这一机制的技术价值在于支持清晰的代码分层和依赖管理,是构建大型应用的基础。在实际开发中,特别是在涉及多层级目录结构的项目里,开发者常会遇到相对导入相关的运行时错误,如ValueError: attempted relative import beyond top-level package。这类问题通常源

weixin_30984001的博客 343

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

import attributes 与 import.meta:ESM 中加载期指令与运行期档案的边界

ES Modules 早已不是简单的 import/export 关键字,模块加载器需要处理 JSON 导入、资源类型声明、运行路径获取等复杂需求。import attributes 与 import.meta 正是解决这些需求的关键语法,但两者常被混淆。import attributes 是加载器侧的“加工备注”,在模块解析期生效,告诉引擎按什么类型处理资源;import.meta 则是宿主环境注入的模块元数据对象,在运行期提供 url、resolve、dirname 等身份信息。理解二者在生命周期和信息

keke1314520的博客 288

Python导包,一文说清!

初学者常见的情况是写惯了单个脚本,遇到需要时便犯了难栽了跟头,常出现找不到包的错误本期目的是以尽可能浅显易懂的方式将涉及的知识点及可能遇到的坑讲清楚。

啥都生的博客 1238

如何用 Attester Import Check hook 阻止 Copilot coding agent 写入不存在的依赖包?

当 GitHub Copilot coding agent 替你写代码时,它偶尔会引入并不存在的第三方包。一篇 USENIX Security 2025 研究测量到 LLM 建议的包名中有 5.2% 到 21.7% 实际不存在。awesome-copilot 仓库中的 Attester Import Check hook 针对的就是这个问题:它在 `preToolUse` 事件上拦截 coding

gitblog_00750的博客 312

Python模块化编程实战:从import到项目结构优化

从概念到原理,再落到工程实践,围绕“模块化”这个基础话题展开。理解Python模块的本质是一个.py文件,以及import背后sys.modules与sys.path的查找机制,是解决ModuleNotFoundError和循环导入等高频问题的关键。通过合理拆分模块、设计包结构、使用__init__.py收口接口,以及配合虚拟环境和pip install -e .进行本地包管理,能显著提升代码复用性与可维护性。文章结合实际爬虫与数据处理案例,演示如何搭建数据抓取、清洗、存储的模块化项目,并给出调试技巧与命名

weixin_30231327的博客 307

Python路径处理详解:从相对路径原理到pathlib实战应用

在编程开发中,文件路径处理是基础且关键的技术环节,它直接关系到程序的健壮性和可移植性。理解相对路径的核心在于掌握“当前工作目录”这一参照系,程序执行时所有相对路径都是基于此目录进行解析的。Python提供了os.path和pathlib两大模块来处理路径操作,其中pathlib作为现代解决方案,通过面向对象的方式让路径拼接、解析和文件操作更加直观安全。掌握路径处理技术对于数据分析、Web开发、自动化脚本等涉及文件读写的场景至关重要,能有效避免常见的FileNotFoundError等问题。本文通过实际案例深

weixin_30896511的博客 317

告别 `../../../`:在 Next.js 中配置绝对导入(baseUrl)与模块路径别名(paths)的完整指南

> 本指南以仓库示例 [examples/with-absolute-imports](https://link.gitcode.com/i/f44895d97557ad86efb17502c2cecff4) 为骨架,系统讲解在 Next.js 项目中如何通过 `tsconfig.json`(或 `jsconfig.json`)的 `baseUrl` 与 `paths` 两个编译选项,用绝对导入取

gitblog_01067的博客 415

UI-TARS 实战拆解:5 分钟部署多模态 GUI 智能体,一次讲清坐标与提示词选型

如果程序能替你把鼠标点掉,把重复表格填完,操作那些每天都在用的软件,而你还不想再维护一套元素定位脚本——UI-TARS 就是干这个的:一个开源的多模态 GUI 智能体,给它一张截图加一句指令,它输出点击、拖拽、输入这类 GUI 自动化动作。本文带你部署它、选模板,并讲清坐标如何落到真实点击。 ## 一句话定位:它解决什么问题 UI-TARS-1.5 是开源多模态 GUI 智能体,开源版本为 7

gitblog_00612的博客 127
上一篇: Python Import 为什么报错?搞懂 sys.path 就明白了
下一篇: PyCharm 里 import 不报错,运行却失败?Sources Root 的锅
未收敛
博客等级 码龄11年 3303粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未收敛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值