Python进阶(十一)----包,logging模块

mac2022-06-30  53

Python进阶(十一)----包,logging模块

一丶包的使用

什么是包:

​ 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文件夹就是包.

包的作用:

​ 将文件夹/模块组织起来,来提高程序的结构性和可维护性.

​ 目的不是运行,为了导入使用.包只是一种形式,包的本质就是一个模块

import:

# 创建一个包,也会发生三件事: ''' 1. 将该aaa包内 __init__py文件加载到内存. 2. 创建一个以aaa命名的名称空间. 3. 通过aaa. 的方式引用__init__的所有的名字. ''' # 引入包 aaa , aaa作为一个包,默认执行__init__文件 import aaa print(aaa.x) # 引用aaa包中__init__的 x变量 aaa.f1() # 引用aaa包中__init__的 f1函数 #错误实例 print(aaa.m1) #m1 在aaa包中的一个py文件 ,会报错, 因为m1找不到 print(aaa.m1.a) #m1 在aaa包中的一个py文件 ,会报错, 因为m1的a变量找不到 ### 我想要引用 aaa包的m1文件的a变量 ### 错误示例1: import aaa # 1. aaa的 __init__ 里面 写import m1 # 2. print(aaa.m1.a) # print(aaa.m1.a) # 报错原因: No module named 'm1' # 分析报错原因: 模块找不到 内存,内置,sys.path三个地方找不到. # m1 不在内存,不在内置,sys.path 会主动加载执行文件(包的使用.py)的当前目录. # 解决方式: import aaa # 1. 在执行文件写入 import aaa # 2. aaa的 __init__ 里面 写 from aaa import m1 # 3. 然后在执行文件 aaa.m1.a # print(aaa.m1.a) # aaa.m1.func1() ### 想要引用aaa包中的bbb包 import aaa # 1. 在执行文件写入 import aaa # 2. aaa的 __init__ 里面 写 from aaa import bbb # 3. 然后在执行文件 aaa.bbb # print(aaa.bbb) ### 如何在当前文件中,引用 aaa包的bbb包 的 变量 name. # 1. 在执行文件写入 import aaa # 2. aaa的 __init__ 里面 写 from aaa import bbb # 3. 然后在执行文件 aaa.bbb # print(aaa.bbb) # 如何在当前文件中,引用 aaa包的bbb包 的 mb文件的函数func. # 1. 在执行文件写入 import aaa # 2. 在aaa包的__Init__ 写上 from aaa import bbb (这样写 bbb包的__init__里面所有的名字都能引用) # print(aaa.bbb.name) # 3. 在bbb包的__Init__ 写上 from aaa.bbb import mb # aaa.bbb.mb.func3() ### 首先 无论从哪里引用模块,import 或者 from ... import ... ### 最开始的模块或者包名一定是内存,内置,sys.path三个地方中能找到的.(可参考bbb包中的 __init__) ### 直接import 为了让我们会使用 包里面的 __init__

from ... import ...

### from ... import ... # 通过这种方式不用设置__init__文件 from aaa import m1 m1.func() from aaa.bbb.m2 import func1 func1() from aaa.bbb import m2 m2.func1() #### from 包 import 变量 #比如: from a.b.c import d.e.f # c的 .的前面一定是包 ( c 可以是一个包,也可以是一个文件. 但是c之前的肯定是包) # import 变量或者是模块名字或者是具体的变量, 但在后面不能再有 .变量或者是 .模块名字 from aaa.bbb.m2.func1 import a # 错误的 from aaa.bbb import m2 m2.func1()

相对导入与绝对导入

# 由于nb模块增加了很多很多功能,所以我们nb这个文件就要划整一个包, # 无论对nb模块有任何操作,对于使用者来说不应该改变,极少的改变对其的调用. import sys sys.path.append(r'D:\s23\day19\相对导入绝对导入\dir') import nb nb.f1() nb.f2() nb.f3() nb.f4() nb.f5() nb.f6() # 我将原包名改成了大写的NB import sys sys.path.append(r'D:\s23\day19\相对导入绝对导入\dir') import NB as nb nb.f1() nb.f2() nb.f3() nb.f4() nb.f5() nb.f6() nb.f7() # 目前为止,今天所看到的引用模块的方式都是绝对导入 # 相对导入: .(当前路径) ..(父级路径) #相对导入: #NB中 下的init文件 from .m1 import f1,f2 from .m2 import f3,f4 from .m3 import f5,f6 from .dsb.ly import f7 # m1,m2,m3 文件的内容相似 def f1(): print('in f1') def f2(): print('in f2') # 执行文件.py import NB as nb # 还是nb调用 nb.f7() # f7是ly文件中的函数

相对路径导入( . 或者 ..)

二丶logging日志模块

系统日志: 记录服务区的一些重要信息: 监控系统,cpu温度,网卡流量,重要的硬件的一些指标网站日志:访问异常, 卡顿,网站一些板块 ,受欢迎程度,访问量,点击率,等等,蜘蛛爬取次数等等辅助开发日志: 开发人员在开发项目中,利用日志进行排错 ,排除了一些避免不了的错误. 辅助开发记录用户信息日志:用户的消费习惯.偏好等等

日志记录的三个版本:

### 简易版 只能选择打印到终端,或者是保存到文件 import logging logging.basicConfig( level=30, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', filename='简易版.log', # 编码是根据系统的编码进行的 filemode='w', # 默认是 a 模式 ) # 日志级别 logging.debug('调试') # 10 logging.info('正常') # 20 logging.warning('警告调试') # 30 logging.error('错误信息') # 40 logging.critical('严重错误') # 50 ### 标准版 保存在文件,同时显示在终端. 但是一次只能保存在一个文件 import logging logger = logging.getLogger() # 创建logger 对象容器 # 创建一个 handler 用于写入日志文件 fh = logging.FileHandler('标配版.log', encoding='utf-8',mode='w') # 用于输出到控制台 sh = logging.StreamHandler() # 显示格式 formatter = logging.Formatter('%(asctime)s-%(name)s') # 控制对象绑定格式 fh.setFormatter(formatter) sh.setFormatter(formatter) # logger 添加 handler对象 logger.addHandler(fh) logger.addHandler(sh) # 设置开关 logger.setLevel(10) fh.setLevel(10) sh.setLevel(40) logging.debug('调试模式') logging.info('正常模式') logging.warning('警告模式') logging.error('错误模式') logging.critical('严重错误模式') ### 旗舰版 同时再终端打印,保存文件. 还支持多个文件记录保存 # -*-coding:utf-8-*- # Author:Ds import os import logging.config #### 定义三种日志的输出格式 # 全面的日志内容 def my_log(file_name): standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]' # 简易模式 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' # 极简模式 id_simple = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志的输出格式 logfile_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '日志文件夹') # 判断一下路径存在不存在 if not os.path.isdir(logfile_dir): os.makedirs(logfile_dir) # log 文件全路径 logfile_name = '日志1' logfile_name1 = 'staff' logfile_name2 = 'boss' logfile_path = os.path.join(logfile_dir, logfile_name) logfile_path_staff = os.path.join(logfile_dir, logfile_name1) logfile_path_boss = os.path.join(logfile_dir, logfile_name2) # log 配置字典 LOGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': standard_format, #将记录日志的模式,以键值对的形式保存 }, 'simple': { 'format': simple_format }, 'id_simple': { 'format': id_simple }, }, 'filters': {}, 'handlers': { # 打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕(控制台) 'formatter': 'simple' }, # 打印到文件的日志,收集info及以上的日志 'default': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存文件 ,轮寻模式 'formatter': 'standard', # 定义使用哪种格式 'filename': logfile_path, # 日志的文件路径 'maxBytes': 1024 * 1024 * 5, # 日志大小5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的编码 }, # 打印到文件的日志,收集nfo及以上的日志 'staff': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存文件 ,轮寻模式 'formatter': 'standard', # 定义使用哪种格式 'filename': logfile_path_staff, # 日志的文件路径 'maxBytes': 1024 * 1024 * 5, # 日志大小5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的编码 }, # 打印到文件的日志,收集info及以上的日志 'boss': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存文件 ,轮寻模式 'formatter': 'id_simple', # 定义使用哪种格式 'filename': logfile_path_boss, # 日志的文件路径 'encoding': 'utf-8', # 日志文件的编码 } }, 'loggers': { # logging.getLogger(__name__) # 拿到logger的配置 '': { 'handlers': ['default', 'console','staff','boss'], # 这里是将定义好的两个handler对象添加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True # 向上(更高level的logger)传递 }, }, } logging.config.dictConfig(LOGING_DIC) # 导入上面的定义的logging的配置 logger=logging.getLogger(file_name) # 生成一个log实例 return logger # logger.info('It works!') # 记录该文件运行的状态 ret=my_log('Tex') # 这里的Tex 给了 日志格式化的taskId ret.info('Successful记录日志!!') # 日志消息 message

转载于:https://www.cnblogs.com/dengl/p/11117277.html

最新回复(0)