Python的模块(module)和包(package)

这篇具有很好参考价值的文章主要介绍了Python的模块(module)和包(package)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python的模块(module)和包(package)

Python的模块(module)和包(package)概述

在Python中,简单地说,模块(Module)一般是单个python文件;包(package)由分层模块(Module)构成——相关目录里的模块构成。Python中的库(library)是参考其它编程语言的说法,既可以是一个模块也可以是一个包,换言之是对模块或包的通俗的说法。

模块(module)其实就是py文件【注1】,里面定义了一些函数、类、变量等。模块的名字就是该文件的名字(不包含后缀)。

【注1:Python 中的模块,往往对应于Python 程序文件。每一个文件都是一个模块。模块也可以是使用如 C、 Java或C#等其他语言编写的扩展包,甚至还可以是在包导入时的文件路径。一般情况下,是一个以.py为后缀的文件,其他可作为module的文件类型还".pyo"、".pyc"、".pyd"、".pyw"、".dll",但Python初学者几乎用不到。】

模块的分类【注2】:标准模块(库)、第三方模块(库)、自定义模块。

自定义模块就是你自己编写的模块,如自己定义的函数,需要经常调用时,就可以自己定义一个模块,将常用函数、类、变量等写入模块里,另外的模块若要使用,使用import语句导入该模块,就可以使用了。第三方模块的数量非常庞大,有许多非常有名并且影响广泛的模块。第三方模块需要安装(详情可见 https://blog.csdn.net/cnds123/article/details/104393385),再使用import语句导入后使用。标准模块(库)是安装Python时自动安装在Python安装路径的Lib文件夹中,不需要用户安装,可以直接使用import语句导入后使用

【注2;还有一个分类内置模块(built-in module),内置模块是用C写的,提供了对系统功能的访问。从Python的标准库路径下面是找不到的。虽然内置模块不是标准库,但是内置模块可以划分到标准库一类中去,这里需要注意的是划分归类,而不是本质相同。大多数情况下,对它们之间没有做区分的必要。但是在理解Python的模块查找顺序时,这却是一个主要的差异。https://www.cnblogs.com/pluse/p/8667864.html】

包(package)是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹。import 语句中的目录路径只能是以点号间隔的——子包名与其父包名会以点号分隔。

可以把包看成是文件系统中的目录,并把模块看成是目录中的文件。包通过层次结构进行组织,在包之内除了一般的模块,还可以有子包。

Python 定义了两种类型的包,即 常规包(regular packages) 和 命名空间包(namespace packages)。常规包是存在于 Python 3.2 及更早版本中的传统包。常规包即包含 __init__.py 文件的目录。当导入一个常规包时,__init__.py 文件被隐式执行,而且它定义的对象被绑定到包命名空间中的名称。 __init__.py 文件能包含其他任何模块能够包含的相同的 Python 代码,而且在导入时,Python 将给模块增加一些额外的属性。

从 Python 3.3 开始,Python 引入了 命名空间包 的概念。命名空间包是不同文件集的复合,每个文件集给父包贡献一个子包,所有的包中都不需要包含 __init__.py 文件。文件集可以存于文件系统的不同位置。文件集的查找包含导入过程中 Python 搜索的压缩文件,网络或者其他地方。命名空间包可以但也可以不与文件系统的对象直接对应。命名空间包提出的本意却不是说为了导入没有init.py 的文件夹的 Python 模块,而是利用命名空间包这个技术来导入目录分散的代码。

顺便提示:所有包都是模块,但并非所有模块都是包。换句话说,包只是一种特殊的模块。具体来说,任何包含__path__属性的模块都被视为包。

【官方文档:6. 模块 — Python 3.10.7 文档

5. 导入系统 — Python 3.10.7 文档 】

这两个概念,有助于我们更好地使用python进行模块化编程,通过模块化编程,我们能把大的工程拆分成子任务(子模块),好处是,可维护性好,问题也便于排查;编写好的模块复用性好,当需要重复实现时,再次调用即可,不必再重新编写了;每个模块都有单独的命名空间,避免发生一些例如变量、函数命名上的冲突。可用于python复杂程序的组织【https://blog.csdn.net/cnds123/article/details/108614392 】。

Python的模块、包的导入使用

import 语句有两种形式

基本的 import 语句(不带 from 子句)和 带 from 子句的import 语句。

基本的 import 语句(不带 from 子句)格式:

import 模块名 [as 别名]

对于包

import 包名.模块名 [as 别名]

其中,对于包中含包的包名之间英文句号分隔。

使用户程序(导人者)以一个整体获取一个模块,这种形式想使用模块或包中的成员(模块中的函数、类、变量)需要加前缀:“模块名.”、 “包名.模块名.”或 “别名.”

带 from 子句的import 语句格式:

from 模块名 import 成员名 [as 别名]

其中,成员名可以有多个,之间用英文逗号分隔

对于包

from 包名.模块名 import 成员名 [as 别名]

允许用户程序从一个模块文件中获取特定的名称 ,这种形式因已指出了成员名,这种形式想使用模块或包中的成员可以直接使用成员名无需加前缀,若为成员名指定了别名,可以直接使用别名无需加前缀。

导入包的方法与导入模块的方法类似,需要注意的只是要用点号语法指明路径层次——import 语句中的目录路径只能是以点号间隔。

【import语句的用法可参照https://www.jb51.net/article/238794.htm 】

补充说明

1)可以一次导入多个模块,多个模块之间用逗号隔开,如:import sys,os

2)在导入多个模块的同时,也可以为模块指定别名,如导入sys、os两个模块,并为sys指定别名s,为os指定别名o:

import sys as s,os as o

3)导入模块成员时,也可以为成员指定别名,如导入sys模块的argv成员,并为其指定别名v,这样就可以直接使用成员的别名访问:

from sys import argv as v

print(v[0])  #就相当于 print(argv[0])

3)可以 *代表多有成员,此方式不推荐使用

比如同时导入 module1 和 module2 内的所有成员:

from module1 import *

from module2 import *

假如这两个模块内都有一个 foo() 函数,那么当在程序中执行如下代码时:

foo()

上面调用的这个 foo() 函数到底是 module1 模块中的还是 module2 模块中的?因此,这种导入指定模块内所有成员的用法是有风险的。

4)import语句是最常用的导入机制,但并不是唯一的方式,importlib 模块以及内置的__import__() 方法都可以实现模块的导入。

import的搜索顺序

当import语句导入后,默认情况下,搜索模块的路径为:首先判断这个module是不是built-in module(内置模块,见前面【注2】),然后:

1)当前目录的路径

2)环境变量 PYTHONPATH 中指定的路径列表

3)Python 安装路径

可以利用sys.path查看当前的搜索路径

import sys

sys.path

Python的模块(module)和包(package)

说明,sys.path在python脚本执行时动态生成,一个由字符串组成的列表,用于指定模块的搜索路径。一般来说,第三方库会安装在site-packages路径下。列表的第一项 path[0] 若为空字符串,这将导致 Python 优先搜索当前目录【注3】中的模块。

【注3:当前正在使用的目录称为当前目录(或者工作目录)。执行程序的编译和运行时,执行对象所在的目录基本上就被视为当前目录。】

要修改import搜索路径有多种方式:

1)临时添加,即动态修改 sys.path,因为 sys.path 为 list,所以我们可以很轻松的操作 list 实现搜索路径的修改。这种方式只会对当前项目临时生效——只在执行当前文件的窗口中有效,窗口关闭后即失效。

import sys

sys.path.append('D:/demo/python_module')

其中,'D:/demo/python_module' 也可写为 'D:\\demo\\python_module'

Python代码使用的路径中若使用的 '\' 需要使用 \ 进行转义写为\\

2)修改 PYTHONPATH 环境变量,这种方式会永久生效,而且所有的 Python 项目都会受到影响,因为 Python 程序启动时会自动去读取该环境良好的值。

不同平台设置流程不尽相同,这里以windows10操作系统中为例:按WIN+R键,打开“运行”对话框,输入sysdm.cpl,按回车键也能打开“系统属性”对话框,“高级”选项卡中,单击“环境变量”按钮,单击系统变量中的“新建”按钮,在“变量名”文本框内输入 PYTHONPATH,表明将要建立名为 PYTHONPATH 的环境变量;在“变量值”文本框内输入D:\demo\python_module

Python的模块(module)和包(package)

然后点击“确定”。重启系统才能使之生效。这种方法添加的路径可以对安装的多个不同版本的Python都生效。

3)增加.pth 后缀的文件。在 sys.path 已有的某一个目录下添加.pth 后缀的配置文件,该文件的内容就是要添加的搜索路径,Python 在遍历已有目录的过程中,如果遇到.pth 文件,就会将其中的路径添加到 sys.path 中。

Python 在遍历已知的库文件目录过程中,如果见到一个 .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件所指明的库也就可以被 Python 运行环境找到了。这个文件虽然可以放在python的已知库文件的目录里面就可以了,不过我还是建议统一放到python安装目录的site-packages目录中。

主文件名是没有限制的,你可以根据自己的库内容进行定义,只要扩展名为.pth就可以了。文件内容一般只要设置一下路径就可以,可以是相对路径(相对于.pth所在的路径),也可以是绝对路径。如用记事本建立一个名为mypath.pth文件,添加内容(根据你实际需要写)如D:\demo\python_module,放到python安装目录的site-packages目录中。

4)将模块保存到指定位置

可以直接将我们已编写好的py 文件添加到Python安装路径中的lib\site-packages 路径下,就相当于为 Python 扩展了一个 模块,这样任何 Python 程序都可使用该模块。

使用模块(module)和包(package)的例子

下面给出一个简单而完整的示例项目,其目录结构如下

Python的模块(module)和包(package)

其中,call_test2.py 要导入使用first.py和abcd.py

first.py文件的内容如下:

a = 1.5
def myfun(s):
return(s + 1)

abcd.py文件的内容如下:

a = 20
def myfun(s):
    return(s*s)

 call_test2.py文件的内容如下:

import first
import folder1.abcd as second
print(first.a) #显示1.5
x=3
print(first.myfun(x)) #显示4
print("----------")
print(second.a) #显示20
y=5
print(second.myfun(5)) #显示25

运行call_test2.py,效果如下:

Python的模块(module)和包(package)

从此例中,可以明了感知,每个模块都有单独的命名空间,避免发生一些例如变量、函数命名上的冲突。

推荐阅读:

t​​​​​​​Python behind the scenes #11: how the Python import system works (tenthousandmeters.com)https://tenthousandmeters.com/blog/python-behind-the-scenes-11-how-the-python-import-system-works/文章来源地址https://www.toymoban.com/news/detail-492782.html

到了这里,关于Python的模块(module)和包(package)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实验五 函数、模块和包

    2024年02月10日
    浏览(53)
  • CMake:检测python模块和包

    上一篇,我们基本了解了如何去检测 python 的解释器和 python 库。通常,代码是依赖于特定的 python 模块,无论是 python 工具、嵌入 python 的程序,还是扩展 python 的库。例如, numpy 包。依赖于 python 模块或包的项目中,确定满足对这些 python 模块的依赖非常重要。 项目地址:

    2024年02月13日
    浏览(38)
  • Python标准库(Python自带的模块和包)

            “自带电池”指python语言的标准库,因为它包含了丰富的功能和工具,几乎可以满足大部分的开发需求,就像一个内置电池一样,所以python标准库被称之为“自带电池”。 python中的os模块提供了丰富的与操作系统交互的函数。开发人员可以通过os模块提供的函数对

    2024年02月05日
    浏览(42)
  • Python模块和包:sys模块、os模块和变量函数的使用

    模块化指将一个完整的程序分解为一个一个小的模块,通过将模块组合,来搭建出一个完整的程序。模块化具有方便开发、维护和复用的优点。在Python中,每个py文件就是一个模块。 在一个模块中引入外部模块有两种方式: import 模块名 和 import 模块名 as 模块别名 。后者可以

    2024年02月08日
    浏览(34)
  • Module not found: Error: Package path 找不到模块

    [1] ERROR in ./src/node_modules/react-bootstrap/esm/AbstractModalHeader.js 3:0-63 [1] Module not found: Error: Package path ./useEventCallback is not exported from package E:ProjectSource-Code87VR-Game-Electronsrcnode_modules@restarthooks (see exports field in E:ProjectSource-Code87VR-Game-Electronsrcnode_modules@restarthookspackage.json) [1] @

    2023年04月20日
    浏览(38)
  • 【100天精通python】Day15:python 第三方模块和包,模块如何以主程序形式执行

    目录 1 常用的第三方模块 2. 第三方模块的安装和使用 2.1 安装第三方模块:

    2024年02月15日
    浏览(55)
  • Python3.11教程3:模块和包(pip/conda)、文件系统(os/ shutil/json/pickle/openpyxl/xlrd)

    本文相关链接: Python官网、Python 3.11.5 中文文档、慕课:Python语言程序设计、Real Python :Write More Pythonic Code Miniconda、Anaconda、conda文档 Python 标准库官方文档、 《os — 多种操作系统接口》、《os.path — 常用路径操作》、《shutil — 高阶文件操作》 Pandas文档《Input/output》、 op

    2024年02月09日
    浏览(53)
  • Python工程师Java之路(p)Module和Package

    Module通常译作 模块 ,Package通常译作 包 Python模块(Module):1个以 .py 结尾的文件 在模块中可定义的变量、函数、类以供外部使用 如: from 包.模块 import 函数 、 from 包 import 模块 、 import 模块 Python包(Package):实质上是1个目录(Directory) 在包被导入时,包里的 __init__.py 会

    2024年02月08日
    浏览(46)
  • Lua学习笔记之迭代器、table、模块和包、元表和协程

    迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素。 泛型for自己内部保存迭代函数,实际上保存三个值:迭代函数、状态常量、控制变量。

    2024年03月09日
    浏览(61)
  • python中导入logru模块 报错 No module named loguru

    1、导入日志模块异常报错 报错信息: from loguru import logger E   ModuleNotFoundError: No module named  loguru 2、解决方案:安装logru 方案1:pycham编辑器 -- 文件 -- 设置  该方式有时候安装不成功 方案2:打开终端 pip install logru 该方式比较慢,偶尔也会出错 方案3:打开终端 pip install log

    2024年02月11日
    浏览(110)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包