Python 包、模块、导入规则

首先:在python中文件夹名不等于包名,文件夹中直接包含__init__.py文件的文件夹才是包,包的核心标识是 __init__.py。

其次:直接运行文件时,仅绝对导入(也就是无 .)生效,相对导入(也就是有 .)必报错;因为直接运行文件的目录就是root目录 放在 sys.path中的,如果有相对引用,就会报错。要使用绝对路径。比如a,b是同一个路径下的,运行a, 那么a的路径就是 root,被保存 在sys.path中,如果a中导入b中的方法,直接使用绝对路径 from b import B ,就能找到root+b的绝对路径,而不要再添加一个. 号了。如果路径格式如下:

p

|

-------p1

| |

| --------a.py

--------p2

|

-------b.py

python 复制代码
# p/p2/b.py
class B:
    def __init__(self):
        print("我是p2/b.py中的B类")
python 复制代码
# p/p1/a.py
import sys
from pathlib import Path

# 关键:把根目录p/加入sys.path
# Path(__file__) 是a.py的路径 → parent是p1/ → parent.parent是p/
ROOT_PATH = Path(__file__).parent.parent
sys.path.append(str(ROOT_PATH))

# 现在可以用绝对导入p2.b中的B类 因为p/已经在sys.path中了,可以直接看到p2.b
from p2.b import B

if __name__ == "__main__":
    b = B()  # 运行后输出:我是p2/b.py中的B类

其三:相对引用格式: .a 表示当前路径下的a文件,..a 表示上一级路径下的a文件,...a 表示上上一级的a文件。相对引用只能在 sys.path目录之内,不能跨过添加到sys.path的ROOT。

其四:当前运行的文件a, 系统会自动将当前文件路径添加到 sys.path中,Path(file) 是a.py的路径 → parent是p1/ → parent.parent是p/。

其五:还可以将深层的函数向上导出,从而简化导入路径。

在p/p2/init.py中

python 复制代码
#p/p2/__init__.py
from .b import B
__all__=['B']

在p/init.py中

python 复制代码
#p/__init__.py
from .p2 import B
__all__=['B']

这样外部就可以直接用 from p import B了

p

|

-------p1

| |

| --------a.py

--------p2

| |

| -------b.py

|

c.py

小结:

  • 包的本质 :带 __init__.py 的文件夹才是规范的包(框架开发必加),包内用相对导入(.xxx),外部用绝对导入;
  • sys.path 是核心 :Python 只从 sys.path 里找模块,直接运行文件时,文件所在目录会自动加入 sys.path,跨目录导入需手动加根目录;
  • 简化导入的技巧 :通过多层 __init__.py 逐级导出模块(如 YOLO 的 from ultralytics import YOLO),无需写深层路径;
  • 运行规范 :包内模块只做定义,可执行逻辑放 tools/ 下的入口脚本,避免直接运行包内文件导致相对导入报错。
相关推荐
2601_966949651 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪3 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风4 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
在世修行5 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI6 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫7 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障