Python中的模块系统

简介: Python中的模块系统


模块


随着程序功能越来越复杂,代码量也急剧增加。可以通过将逻辑相近的代码分割到不同的文件中,减少单个文件中代码的行数,提高可维护性。在Python中一个py文件就是一个模块,一个大型的代码项目,一般是由多个文件(模块)组成。一个模块可以被另一个模块导入使用。

在Python中,包含__init__.py文件的目录被称为包,包被用来声明模块之间的查找关系。比如下面的app就是一个包,test也是一个包。app可以被看做是test的子包。

test├──app├──config.py├──__init__.py└──lib.py├──__init__.py└──main.py


__init__.py文件可以为空。__init__.py文件中一般用来导出所在目录下的其他模块。
当目录中不存在__init__.py文件时,该目录也可以被称为一个包,只是习惯上喜欢在每个目录中放置一个__init__.py文件。至于两者区别,含有__init__.py的目录,可以讲__init__.py看做一扇可以通往该目录下所有模块的大门,


导入方法


在Python中导入一个包或模块时,有两种主要的方法,一种是使用import关键字进行导入,另一种是使用官方库importlib来进行导入,后者常被用于一些需要自定义导入的,或者是自动导入某些模块的场景下。


导入一个模块

app├──config.py├──__init__.py└──lib.py


lib.py导入config.py时,可以直接通过import进行导入

# lib.pyimportconfig


导入一个包

test├──app├──config.py├──__init__.py└──lib.py├──__init__.py└──main.py


main.py中导入app包时,可以直接使用import进行导入

# main.pyimportapp


与导入模块不同,导入一个包时,包目录下的__init__.py文件会被自动执行。


导入包中的某一个具体模块时

importapp.lib


那么导入一个包可以认为是通过下面这种方式进行导入的,只是在Python中可以将这种方式简写为imoprt app

importapp.__init__asapp


as


在导入时,Python会将当前导入的包或模块自动添加到全局变量空间中,有时可能会出现下面这种情况

importlib1.appimportlib2.app


在不同的包中,存在名字相同的模块,这是后者就会将前者覆盖,通过as可以将导入的变量重命名。

importlib1.appasapp1importlib2.appasapp2


使用相对路径进行导入


当代码项目过大时,文件关系复杂或者模块的嵌套层级过深时,可以通过相对导入的方式进行导入某一个模块

test├──app├──config.py├──__init__.py├──lib.py└──__pycache__└──__init__.cpython-39.pyc├──auth├──config.py└──__init__.py├──__init__.py└──main.py


app/lib.py文件需要使用auth/config.py模块的功能时,可以这样进行导入

# app/lib.pyfrom ..authimportconfigasauth_config


这种导入方法必须是使用from进行导入,包前面一个点表示同一目录,两个点表示上一级目录,三个点表示上一级目录的上一级目录,以此类推。
在使用这种方法时,对于新手经常会出现下面这种报错

ImportError: attemptedrelativeimportwithnoknownparentpackage


出现这种原因是因为,在使用相对导入时,必须存在一个最上层位置,在Python中,使用python main.py运行main.py文件,则main.py所在的目录即为最上层位置,其他的则为下层位置。当python test/app/lib.py时,最上层位置变成了test/app,所以此时..auth自然无法找到。解决方法是,在使用相对路径导入时,要明确最后运行文件的所在目录,来确定最上层位置,如果你确定不了,那就最好不要使用。


循环导入


当一个项目的模块数量很多时,可能模块之间的依赖关系错综复杂,会出现A导入B,而B也导入了A,从而构成了循环导入的情况。

# A.pyimportBprint(B.b)
a=1# B.pyimportAprint(A.a)
b=1
pythonA.pyAttributeError: partiallyinitializedmodule'B'hasnoattribute'b' (mostlikelyduetoacircularimport)


出现循环引用问题,绝大多数情况都是因为人为设计失误造成的,你可以通过引入新模块,减少A和B相互依赖的变量。


importlib


在使用import关键字导入模块时,会调用内置的__import__方法,通过importlib可以绕过__import__方法,实现自己的导入模块的逻辑,比如在导入前做一些初始化工作,或者是进行自动导入的逻辑。

test├──app├──config.py├──__init__.py├──lib.py└──__pycache__└──__init__.cpython-39.pyc├──auth├──config.py└──__init__.py├──__init__.py└──main.py


fromimportlibimportimport_moduleapp_config=import_module('app.config')


需要注意的是,在使用这种方式在导入一个包下面的模块时,__init__.py也会自动被调用。


一些常见的import写法

fromappimportconfigasapp_configimportapp.configasapp_config# import * 表示导入所有的模块fromappimport*asapp_all


Python是如何进行查找路径的


在Python中,import通过sys.path下面的路径进行查找要导入的包或模块。Python首先会先从当前目录中查找模块,找不到会继续从sys.path下面进行查找,最后找不到会抛出错误。
可以通过修改sys.path来修改查找的顺序,比如下面这样

test├──app├──config.py├──__init__.py├──lib.py└──__pycache__└──__init__.cpython-39.pyc├──auth├──config.py└──__init__.py├──__init__.py└──main.py
# test/app/config.pyapple='apple'# test/main.pyimportsyssys.path.append('./app')
importconfigprint(config.apple)  # apple


资料引用


https://docs.python.org/zh-cn/3/reference/import.html#
https://docs.python.org/zh-cn/3/library/importlib.html#
https://docs.python.org/zh-cn/3/tutorial/modules.html#

相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
130 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
2月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
349 55
|
1月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
5天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
42 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
132 66
|
2月前
|
Python
Python Internet 模块
Python Internet 模块。
131 74
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
141 63
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
220 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
3月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。

热门文章

最新文章