总结一下Python的模块加载解析

article/2025/8/30 6:04:06

正式的Python专栏第16篇,同学站住,别错过这个从0开始的文章!

学委之前分享了很多代码,也发布了几个库。

新手可以从两篇基础文章入手学习,积累了一些代码,可以考虑做成一个个模块包装代码有利调用和传播!

何为模块

小雷拿了一个短棍,一个铁方块,接着把铁块跟短棍焊接一起,就是我们看到的雷神之锤了!(如下,一把简陋的锤子)

在这里插入图片描述

为什么说这个锤子?

模块就是一组python功能集合,比如sys, 或者requests这个就是一个模块,或者学委开发的pypiseed也是一个模块,简单理解就是,把基础python代码组合成为一个’锤子‘,被外部使用。

制作模块的意义是,方便更多的模块使用者(开发者)就不用太拘泥这个模块怎么做,简单就调用一个模块。

下面os.py, python自带的模块,这是一个模块!
在这里插入图片描述
下面requests目录, 是学委自己安装的, 这也是一个模块!
在这里插入图片描述
下面的pypi-seed, 也是一个模块,更多介绍在这篇种子项目文章

在这里插入图片描述

模块 vs 库(包) 区别

模块可以是一个python文件, 学委认为也可以是一个库(多个python文件的整体)。

但是我们说一个库,通常就是上面提到的pypi_seed 或者requests这些目录组织的,通常包含多个python代码文件,也就是说复杂度更高,可以理解为‘复杂模块’。

直白来说都是一种“封装”,包装,把零散的功能组合起来,就成做出一个个‘锤子’,解决各种开发遇到的问题。

在python里面也使用“package”(包)来概括这种复杂模块。

在这里插入图片描述
如上图,‘moduledemo’ 就是一个包(package)。

所以严格来说:包 对等于 库,包内有多个模块。使用上包/库/模块都是用‘import’来导入。

制作模块与使用

开发模块

保存下面代码为debug.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:12 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : debug.py
# @Project : helloSHOW_DEBUG = Truedef log(log):if SHOW_DEBUG:print(str(log))

只需要打开安装的python路径里面的lib/python3.8/os.py

在这里插入图片描述
把os.py的代码过一遍,我们可以发现,其实os用了abc/sys/stat这些内置模块,实现了os模块自己的函数比如makedirs(创建目录)或者拓展os.path。

制作一个复杂模块请参考详细指导篇,处理明确模块的功能开发规划,更重要的就是组织,管理发布模块了,这涉及很多知识,请看下面的文章:

保姆级教程带你开发优质的Python库之上篇【模块组织】
保姆级教程带你开发优质的Python库之中篇【命令行】
保姆级教程带你开发优质的Python库之下篇【种子项目】

调用模块 import

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:15 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : test.py
# @Project : hello#option 1
import debugdebug.log("hello 01")#option 2
from debug import loglog("hello 01")#option 3
from debug import log as ll("hello 01")

这里展示了三种调用方式,效果都是一样的。

也可以像下面一样:from 模块名称 import * (任意函数)

from debug import *

包或者库的函数调用参考下面:

#import 包名.模块名 imiport * 或者 (import 特定函数)
from pypiseed.main import *

直接运行一个模块

这个也非常简单,在开发的debug.py模块中添加下面的代码到文件末:


if __name__ == "__main__":log("testing")

运行方式:python debug.py

这个就是告诉python程序这里是main入口程序,里面放入调用模块函数的代码,即可运行。

模块搜索, 定个位

在python中模块是这样被定位/搜索的:

  • 最先从当前运行目录查找模块
  • 如果还没有找到,python尝试搜索PYTHONPATH环境变量指定的多个目录,从前到后一个一个目录查找目标模块
  • 如果前面两个步骤仍旧没有找到,python解析器将会查找默认路径,比如/usr/local/lib/python3/

这上面其实都是路径,我们看到python的模块系统使用了sys.path这个变量来存储,所以直接简记为:从sys.path值里面的目录一个一个查找搜索模块。

sys.path的只也默认的被设置为当前路径,PYTHONPATH, 系统默认(跟安装路径有关),如下图:

在这里插入图片描述

几个模块相关的函数

reload 模块重载函数

我们刚刚看到os.py 出来def 定义了一些函数,还有一些类似"all" 这样的代码,这些代码只会在import/ from import 语句导入模块的时候被执行,我们可以使用reload函数重新加载非方法定义的代码。

使用实例:

#重新加载debug模块,那些在方法体外直接执行的代码会再次被运行。
reload(debug)

dir 罗列函数

dir函数也是内置函数之一,它返回一个排序过的列表。这个列表就是当前程序运行时导入的所有模块。

如下图,分次倒入了不同模块,dir函数的返回值不同了。
在这里插入图片描述

延伸

Python的模块加载跟Java的其实还是有点相像的。

不过Java的会更加复杂一些。Python还支持运行时动态更改模块搜索的路径,这个特性比Java更加灵活,后面会继续分享文章讲解。

对了,喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!


http://chatgpt.dhexx.cn/article/2388A0jL.shtml

相关文章

C++ 函数(模块化编程)

目录 函数定义 函数 函数定义的语法形式 函数调用 调用函数需要先声明函数原型 函数调用形式 嵌套调用 例3-1编写一个求x的n次方的函数 例3-2 数制转换 源代码: 例3-3 编写程序求π的值 arctan函数 主程序 例3-4 寻找并输出11~999之间的数M&#xf…

单片机常开常闭检测

单片机检测常开常闭点(干接点信号)的方法:检测干接点的闭合和断开,从而单片机实施一定的操作,它具有两根线,具体步骤:1、引出单片机一个IO口线,连接干接点一端。2、干接点另一端通过…

干海星怎么吃做法 干海星的功效与作用有哪些

干海星是生活中并不常见的一种海鲜类食材,在很多人眼中干海星都是一种中药材,其实它也可以当做一种菜品来食用,那么干海星应该怎么吃呢?接下来我就把自己总结的干海星吃法大全写出来分享给大家。 干海星怎么吃 干海星的功效与作用…

大前端干货资料

JavaScript 文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference ES6 入门教程:https://es6.ruanyifeng.com/ Vue 官网:https://cn.vuejs.org router 官网:https://router.vuejs.org/zh UI框架 Ele…

干簧管(磁开关)

其实干簧管的工作原理并不复杂 干簧管的特点: 干簧管是干式舌簧管的简称,是一种有触点的无源电子开关元件,具有结构简单,体积小便于控制等优点,其外壳一般是一根密封的玻璃管,管中装有两个铁质的弹性簧片…

苹果手机位置共享后没开启定位服务器,iPhone默认开启但无卵用的设置开着干嘛?难怪手机这么耗电...

原标题:iPhone默认开启但无卵用的设置开着干嘛?难怪手机这么耗电 如果你的苹果手机开启了定位功能,那么在iPhone【设置】-【隐私】-【定位服务】-系统服务】,点击进入后有很多项开关,而很多都是在打开定位服务后默认开…

adams打不开提示msc license_adams安装后打不开

虽然要支持正版……但是 安装后打不开,借鉴了adams2017安装教程后台留言 图片发自简书App 1.首先我这么做是因为其实在安装过程中就有一次没找到路径 。所以该方法仅供参考。 图片发自简书App 此时我直接在“此电脑”内搜索“MSC.Software”了 图片发自简书App 耐心…

使用Arduino开发板连接干簧管(Reed Switch)的方法

topic 1.干簧管(Reed Switch)干簧管的特点:模块使用说明:干簧管有两种常见的类型:干簧管常见的应用需要的组件代码 1.干簧管(Reed Switch) 干簧管,又称磁力开关或磁簧开关&#xff0…

查看电脑使用日志------电脑干了些什么,别人是否动了你的电脑

** 现在我们都有了电脑,有时候短暂的离开可能会有人偷偷的查看你的电脑,有意无意的,总是会感觉心里不是很踏实,那么怎么知道自己的电脑有没有被别人偷偷的查看呢,下面我们通过一些列操作查看电脑是否被别人动过&#x…

高版本envi打不开Landsat8 C2L2数据解决教程

引申部分不写,直接开干 首先找到你的Landsat8 C2L2数据 进入后将首行GROUP LANDSAT_METADATA_FILE改为GROUP L1_METADATA_FILE 编辑—查找—GROUP LEVEL1_PROCESSING_RECORD,查找下一处可得该区域总和 将 GROUP LEVEL1_PROCESSING_RECORD 到 END_…

【错误记录】Melodyne 报错 ( 无法打开音频文件 )

文章目录 一、报错信息二、修改音源格式三、继续使用 Melodyne 打开 一、报错信息 打开一个 48000Hz , 立体声音源 , 采样位数 32 位的采样 , 无法打开 , 报下面的错误 ; 这是用 Bandicam 录制的音频 , 感觉有点问题 , 之后使用 Au 录制音频 ; 二、修改音源格式 在 Adobe Audit…

带你了解测开

测开——测试开发工程师 测试开发工程师 (Software Development Engineer in Test,简称SDET)是指那些既可以称作是开发人员,同时也负责软件开发阶段和测试周期的测试工作的技术人员。一个专业的SDET更关注软件产品的可测性,稳健性和性能。他…

开干,开源 k8s 负载均衡器大比拼

原文链接:https://ewhisper.cn/posts/29610/ 🧠 译者声明: 请注意文章发布时间,时间比较久远,部分观点可能已经过时。原文作者为 PureLB 的利益相关者,所以本文可能不尽客观。 词汇表 英文中文备注LoadBala…

开干!Elasticsearch官方文档离线访问实操指南

Elasticsearch 最少必要知识实战教程直播回放 1、开发不能联网怎么访问Elasticsearch文档? 这是最近被频繁问到的问题。直接上个图: 不能让 Elasticsearch 文档限制了你我的学习热情! 2、直接开干 步骤1:访问:https://…

开干!

阅读本文大概需要 2.6 分钟。 很多人知道,我自由了,但很多人会误以为自由就是在家混吃等死,那人生得多没意思,我也有自己的事要做的,只是会自主安排时间,自主决策事情而已,下周开始,…

python中读写Protobuf总结

Protobuf是谷歌开源的协议框架,以高效传输著称并且支持多种语言。工作中也用到了,在此做个总结。 Protobuf运行原理 下面一张图可以说明: Python中使用Protobuf 2.1安装protoc程序 protoc --version 我安装的是3.6.1版本 2.2定义协议 syntax …

protobuf 入门

参考自 https://juejin.cn/post/7029961388411846664 介绍了protobuf基本概念、优缺点、与protobuf在C上的基本使用 1. 什么是protobuf 它是一个灵活、高效、结构化的序列化数据结构,它与传统的XML、JSON等相比,它更小、更快、更简单。 ProtoBuf是由…

protobuf语法详解

文章目录 一、包(package)二、选项(option)三、消息类型(message)3.1、常规消息类型3.1.1、字段修饰符3.1.2、字段类型3.1.2.1、标量类型3.1.2.2、枚举类型3.1.2.3、Any类型3.1.2.4、oneof类型3.1.2.5、map…

ProtoBuf在中C++使用介绍

ProtoBuf 我们先来看看官方文档给出的定义和描述: protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自…

linux 安装protobuf

从github:https://github.com/protocolbuffers/protobuf 下载源代码 1、根据protobuf GitHub的README.md安装protoBuf (1)安装依赖工具 sudo apt-get install autoconf automake libtool curl make g unzip(2)在prot…