python 包和模块

2023-05-16

python 包和模块

  • 基本概念
    • 模块
  • 框架
  • 包和模块的作用
  • 分类
    • 标准包模块
    • 三方包和模块
    • 自定义包和模块
  • 创建
    • 创建模块
    • 创建包
  • 模块信息
  • 导入
    • from语句导入
  • 导入模块后具体做了什么
  • 导入模块位置顺序
    • 第一次导入时
    • 追加路径的方式
      • 直接修改sys.path
      • 修改环境变量
      • 添加.pth文件
    • 第二次导入时
    • 局部导入
    • 覆盖导入
    • 循环导入
    • 可选导入
    • 包内导入

基本概念

模块

为了使代码更容易维护,提高代码重用价值;可以将一组相关功能的代码写入一个单独的py文件中,供别人导入使用,这个py文件就被称作是一个模块

包是一个有层次的文件目录结构,它定义了由n个模块或n个子包
具体表现形式:包含__init__.py 文件的目录,这个目录下一定得有这个__init__.py文件和其它模块或子包

参照其他编程语言的一个喊法
完成一点功能的代码集合
具体表现可以是一个模块,也可以是包

框架

一个架构层面的概念
从库功能角度来看,解决一个开放性问题而设计的具有一定约束性的支撑结构
通过一个框架,可以快速实现一个问题解决的骨架;到时按照框架角色去填充,交互就可以完成一个质量好,维护性高的项目。
web框架 Flask Django

包和模块的作用

编写好一些轮子,工具代码,供其他模块调用
有效的对程序进行分解,方便代码的管理和维护
可以防止同一模块内的命名重复问题

分类

标准包模块

安装python后,自动帮我们安装好的一些模块,可以直接导入使用
特殊:内建包、模块
当我们在编码的过程中,python自动帮我们导入的模块,builtins,不需要手动的导入该模块,直接使用就可以。

import builtins

print(dir(builtins))

[‘ArithmeticError’, ‘AssertionError’, ‘AttributeError’, ‘BaseException’, ‘BlockingIOError’, ‘BrokenPipeError’, ‘BufferError’, ‘BytesWarning’, ‘ChildProcessError’, ‘ConnectionAbortedError’, ‘ConnectionError’, ‘ConnectionRefusedError’, ‘ConnectionResetError’, ‘DeprecationWarning’, ‘EOFError’, ‘Ellipsis’, ‘EnvironmentError’, ‘Exception’, ‘False’, ‘FileExistsError’, ‘FileNotFoundError’, ‘FloatingPointError’, ‘FutureWarning’, ‘GeneratorExit’, ‘IOError’, ‘ImportError’, ‘ImportWarning’, ‘IndentationError’, ‘IndexError’, ‘InterruptedError’, ‘IsADirectoryError’, ‘KeyError’, ‘KeyboardInterrupt’, ‘LookupError’, ‘MemoryError’, ‘ModuleNotFoundError’, ‘NameError’, ‘None’, ‘NotADirectoryError’, ‘NotImplemented’, ‘NotImplementedError’, ‘OSError’, ‘OverflowError’, ‘PendingDeprecationWarning’, ‘PermissionError’, ‘ProcessLookupError’, ‘RecursionError’, ‘ReferenceError’, ‘ResourceWarning’, ‘RuntimeError’, ‘RuntimeWarning’, ‘StopAsyncIteration’, ‘StopIteration’, ‘SyntaxError’, ‘SyntaxWarning’, ‘SystemError’, ‘SystemExit’, ‘TabError’, ‘TimeoutError’, ‘True’, ‘TypeError’, ‘UnboundLocalError’, ‘UnicodeDecodeError’, ‘UnicodeEncodeError’, ‘UnicodeError’, ‘UnicodeTranslateError’, ‘UnicodeWarning’, ‘UserWarning’, ‘ValueError’, ‘Warning’, ‘WindowsError’, ‘ZeroDivisionError’, ‘build_class’, ‘debug’, ‘doc’, ‘import’, ‘loader’, ‘name’, ‘package’, ‘spec’, ‘abs’, ‘all’, ‘any’, ‘ascii’, ‘bin’, ‘bool’, ‘breakpoint’, ‘bytearray’, ‘bytes’, ‘callable’, ‘chr’, ‘classmethod’, ‘compile’, ‘complex’, ‘copyright’, ‘credits’, ‘delattr’, ‘dict’, ‘dir’, ‘divmod’, ‘enumerate’, ‘eval’, ‘exec’, ‘execfile’, ‘exit’, ‘filter’, ‘float’, ‘format’, ‘frozenset’, ‘getattr’, ‘globals’, ‘hasattr’, ‘hash’, ‘help’, ‘hex’, ‘id’, ‘input’, ‘int’, ‘isinstance’, ‘issubclass’, ‘iter’, ‘len’, ‘license’, ‘list’, ‘locals’, ‘map’, ‘max’, ‘memoryview’, ‘min’, ‘next’, ‘object’, ‘oct’, ‘open’, ‘ord’, ‘pow’, ‘print’, ‘property’, ‘quit’, ‘range’, ‘repr’, ‘reversed’, ‘round’, ‘runfile’, ‘set’, ‘setattr’, ‘slice’, ‘sorted’, ‘staticmethod’, ‘str’, ‘sum’, ‘super’, ‘tuple’, ‘type’, ‘vars’, ‘zip’]

三方包和模块

其他开发人员,需要下载安装才可以

自定义包和模块

自己写的模块

创建

创建模块

直接创建.py文件即可

创建包

创建一个文件夹,文件夹内务必创建一个__init__.py这个文件
import 时会自动执行__init__.py

模块信息

查看模块路径:

import os

print(os.__file__)

C:\Users\wqr57\AppData\Local\Programs\Python\Python37\lib\os.py

查看模块内容:

import os

print(dir(os))

导入

import M
如果某个包里的模块,可以通过点语法来定位

import M1, M2

import M as 别名
导入模块时,给模块起个别名

if file_extension == 'txt':
    import txt_parse as p
else file_extension == 'doc':
    import doc_parse as p

p.open()
p.read()
p.close()

包和模块都是对象。
如果导入的是一个包,默认不会导入任何模块
解决方法:
在__init__.py, 再次导入需要的模块(import p1.Tool)

from语句导入

from A import B [as C]

可以从包中导入模块,可以从模块中导入模块资源
可以单个,多个,起别名。
有多层级时,在A处多层级,B处最简。
包里面只能看到模块,看不到模块资源。
from 包.模块 import 内容

只看import 后面的东西

模块通过__all__ 列表字符串告诉外界*可调用内容
from 模块 import *
from 包 import *

需要在模块中添加 __all__ = [‘num1’, ‘num2’],字符串来告诉外界。
需要在包的__init__.py 中添加__all__ = [‘tool1’, ‘tool2’]
变量__all__ 匹配 *
没有__all__ 则导入所有,除了_开头的私有变量

慎用,因为你无法预知到时会导入哪些内容到当前位置,容易产生变量名冲突

导入模块后具体做了什么

第一次导入:

  1. 在自己当下的命名空间中,执行所有代码
  2. 创建一个模块对象,并将模块内所有顶级变量以属性的形式绑定在模块对象上
  3. 在 import 的位置,引入import后面的变量名称到当前命名空间

第二次导入时:
直接执行上述步骤3

结论:
注意,两种导入方式都会大致执行以上的步骤
多次导入模块,该模块并不会执行多次
两种导入方式不存在哪一种更省内存,区别在于把哪一部分内容拿到当前位置来用

导入模块位置顺序

第一次导入时

按照模块检索路径顺序去找,

  1. 内置模块
  2. sys.path

sys.path 构成:

  1. 当前目录
  2. 环境变量PYTHONPATH 中指定的路径列表
  3. 特定路径下的.pth文件中的文件路径列表
  4. 在python 安装路径的lib 库中搜索
import sys

print(sys.path)

['d:\\python\\python_learn', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\wqr57\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\win32', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\win32\\lib', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\Pythonwin']

追加路径的方式

直接修改sys.path

只作用于本次

import sys

print(sys.path)
sys.path.append(r'C:\User\my_directory')
print(sys.path)
['d:\\python\\python_learn', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\wqr57\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\win32', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\win32\\lib', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\Pythonwin', 'C:\\User\\my_directory']

修改环境变量

PYTHONPATH
在这里插入图片描述
在这里插入图片描述

添加.pth文件

存放.pth文件的位置:

import site

print(site.getsitepackages())
['C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\wqr57\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

第二次导入时

从已经加载过的模块中去找
查看已加载模块的方式

import sys
sys.modules

局部导入

在某个局部范围内导入模块,如果想要在全局范围都能使用,在文件顶部导入相关模块

覆盖导入

自定义模块和非内置的标准模块重名,根据前者存储位置,有可能前者会覆盖后者,自定义模块不要与标准模块重名。

使用from package import module

循环导入

模块A内导入了模块B,模块B内也导入了模块A,这样就造成了循环导入
在sys.modules 查找模块

可选导入

两个功能相近的包根据需求优先选择其中一个导入
有两个包A和B都可以实现相同的功能,想优先使用A,而且需要做的在没有A的情况下,使用B做备选

# 优先导入other2

try:
    import other2 as o
except ModuleNotFoundError:
    import other as o

print(o.o1)

包内导入

分为绝对导入和相对导入
包内导入即是包内的模块导入包内部的模块

绝对导入:参照sys.path路径进行检索
例如指明包名或模块名,import a, from a import b

相对导入:使用.来指代相对路径
. 根据模块名称所获取的当前目录
… 根据模块名称所获取的上层目录
from . import a
from … import a

当我们尝试去使用解释器去执行某一个py文件的时候,那他就会确定当前文件所在的目录,然后把这个目录添加到sys.path
添加过之后,sys.path里面的内容几经确定

如果一个py文件直接以脚本的形式进行执行python file,他的名称就是 __main__
如果是使用模块的形式进行加载,那么他的名称由加载的路径决定的,包名.子包名.模块名

print(__name__)
# __main__

正确用法:包内导入使用相对导入,保外导入使用绝对导入

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 包和模块 的相关文章

  • python接口自动化测试

    一 以登录为例 xff0c cookie验证 1 打开登录页面 输入用户名密码 点击登录 前端进行密码加密 调用登录接口 xff0c 传入用户名和加密后的密码 和数据库进行验证 2 打开登录页面 输入用户名密码 点击登录 调用登录接口 xf
  • Android实验2:简易计算器

    1 完成一个计算器的设计 xff0c 可以以手机自带的计算器为参考 设计过程中 xff0c 注意考虑界面的美观性 xff0c 不同机型的适应性 xff0c 以及功能的完备性 2 注意结合Activity的生命周期 xff0c 考虑不同情况下
  • Android实验3:学习使用ListView

    学习使用ListView 1 实现一个列表 xff0c 其中显示班级学号姓名 xff0c 提供添加功能 xff0c 如需要删去某一项 xff0c 长按该项 xff0c 通过弹出菜单显示删除功能 MainActivity java impor
  • Android实验6:数据存储和访问

    分别使用sqlite3工具和Android代码的方式建立SQLite数据库 在数据库建立完成后 xff0c 编程实现基本的数据库添加和删除功能 创建一个学生管理的APP xff0c 基本信息包含学生姓名 xff0c 班级 xff0c 学号
  • Android实验5.1:使用线程

    package com example myapplication import android content Intent import android os Handler import android support v7 app
  • EDIMAX AC1200 Linux Driver

    使用的wifi网卡是EDIMAX AC1200 双频USB无线网卡 环境是ubuntu 20 04 xff0c 使用计算机为Khadas VIM3 安装过程如下 xff1a Prepare required packages sudo ap
  • 解决树莓派3b+刷mate彩虹屏的方法(亲测可用)

    官方说明要改很多东西 xff0c 麻烦且不实用 其实就是启动文件引导有问题 我们只要将原版系统boot里的四个文件复制到mate的boot里即可 见下图 然后启动树莓派 成功 文件下载地址 https download csdn net d
  • VSCode编写C++程序的配置方法

    1 安装mingw xff08 自行下载 xff0c 配制环境变量 xff09 xff0c 使用gcc v检测是否安装成功 2 VScode 文件 打开文件夹 xff0c 选择一个文件夹作为工作区 3 工作区内新建一个文件夹 vscode
  • Jetson nano 系统安装

    Contents Jetson Nano在 EMMC 上安装镜像U 盘启动和 TF 卡启动U 盘启动 复制 eMMC 上系统 TF 卡启动 设置远程登录系统SDK 安装使用 SDK Manager 安装使用指令安装 Linux 操作基础文件
  • NVIDIA Jetson Xavier NX 串口通讯(发送YOLO检测结果)(记录)

    目录 NVIDIA Jetson Xavier NX串口cutecom助手测试发送YOLO检测结果 开始之前声明 xff1a 本文在NVIDIA Jetson Xavier NX上跑YOLOv4模型 xff0c 配合ZED相机实时检测 xf
  • Cmake Error遇到的问题及解决

    qt build 在网上看了好多解决办法 xff0c 好多说添加路径的 xff0c 但是都没有解决我的问题 xff0c 看到有教程说在src路径下 catkin create qt pkg testgui xff0c 也报错了 xff0c
  • arm 交叉编译找不到so_搭建交叉编译环境并验证

    1 搭建编译环境并验证 1 1 实验目的 掌握嵌入式开发环境 交叉编译器的搭建 安装和配置方法 熟悉Linux应用程序的编译 调试方法 xff0c 能够验证X86平台和ARM平台的差异 1 2 实验内容 交叉编译器环境搭建 编写一个典型的L
  • ubuntu优化服务器网络连接数,ubuntu下解决高并发socket最大连接数限制,tcp默认1024个连接...

    linux系统默认ulimit为1024个访问 用户最多可开启的程序数目 一般一个端口 即一个进程 的最高连接为2的16次方65536 通过这个命令 ulimit n 可以看到默认值为1024 查看全局文件句柄数限制 系统支持的最大值 ca
  • printf打印16进制_谈一谈Linux中printf命令的简单用法

    Linux中printf命令的用法 printf命令 xff1a 格式化输出命令 xff0c echo命令的增强版 格式 xff1a printf format 内容1 内容2 格式替换符 xff1a s xff1a 字符串 f xff1a
  • 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一 什么是头文件 xff1f 什么是库文件 xff1f 有什么区别 xff1f 先说总结目标文件 二 什么是静态库 xff1f 什么是动态库 xff1f 有什么区别 xff1f 三 为什么只用在程序头部写上包含的头文件 xff0c
  • PX4使用SD卡开启IMU发布频率为200HZ

    在飞控的sd卡的根目录下创建 96 etc extras txt 96 xff0c 写入 实际中要根据端口考虑是否修改 dev ttyACM0
  • 【c++代码提示】VScode c++ 代码自动补全/智能提示设置

    VScode c 43 43 代码自动补全 智能提示 C C 43 43 拓展第三方库的提示问题命名空间后没有提示CMake自动提示功能 C C 43 43 拓展 从插件商店中安装完C C 43 43 拓展插件之后其实就可以基本实现代码的自
  • ROS:从入门到放弃(三) 发布接收不同类型消息1

    发布接收int类型消息 第一篇文章我们发布接收了string类型的消息 xff0e 我们提到在ROS里发布的消息必须是在ROS中定义了的 xff0e 就是如果你要发布一个string类型的消息 xff0c 你不能直接发布一个std stri
  • centos开机自动挂载磁盘_开机提示dracut:/# 解决方案

    点击上方 蓝字 点击右上角 选 设为星标 标星 防走丢 开机出现dracut CENTOS8 开机突然出现如下提示 找不到CENTOS的ROOT和SWAP分区 xff1f 昨天系统还是好的 那么奇怪 找资料均未能解决 思考 xff0c LI
  • rust快速升级墙指令_rust 一键升级指令

    以下在聊天框内输入 msg message a specified player 私信一个玩家 me Puts your text into a purple color 你的文字将以紫色发出 2 以下在控制台内输入 xff0c 按F1 g

随机推荐