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日志模块

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

日志记录的三个版本:

### 简易版                      只能选择打印到终端,或者是保存到文件
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

Python进阶(十一)----包,logging模块的更多相关文章

  1. 17.Python略有小成(包,logging模块)

    Python(包,logging模块) 一.包 什么是包 官网解释 : 包是一种通过使用'.模块名'来组织python模块名称空间的方式 , 具体来讲 , 包就是一个包含有__ init __.py文 ...

  2. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  3. 18 包 ,logging模块使用

    包: 1 什么是包: 包就是一个包含有__init__.py文件的文件夹 宝本质就是一种模块,即包就是用包导入使用的,包内部包含的文件也都是用来被导入使用 2 为什么要用包 包就是文件夹,那文件加就是 ...

  4. Python进阶----粘包,解决粘包(旗舰版)

    Python进阶----粘包,解决粘包(旗舰版) 一丶粘包 只有TCP有粘包现象,UDP永远不会粘包 什么是粘包     存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时 ...

  5. Python进阶(十二)----re模块

    Python进阶(十二)----re模块 一丶re模块 ​ re模块是python将正则表达式封装之后的一个模块.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. #正则表达式: ...

  6. 关于python中的包,模块导入的问题详解(一)

    最近由于初学python,对包,模块的导入问题进行了资料的搜集,查阅,在这里做一个总结: 一: import 模块 在import的过程中发生了什么?我们用一个实验来说明: 以上截图表明:在impor ...

  7. Python 入门之 内置模块 --logging模块

    Python 入门之 内置模块 --logging模块 1.logging -- 日志 (1)日志的作用: <1> 记录用户信息 <2> 记录个人流水 <3> 记录 ...

  8. Python导入自定义包或模块

    一般我们会将自己写的 Python 模块与 Python 自带的模块分开存放以达到便于维护的目的. Python 运行环境在查找模块时是对 sys.path 列表进行遍历,如果我们想在运行环境中添加自 ...

  9. Python学习 之 包和模块

    1.rpm -ql python #查看python在计算机中安装了哪些文件 2.模块是一个可以导入的Python脚本文件 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的 ...

随机推荐

  1. ubuntu16.04 overlay 不支持redirect_dir开关

    modinfo overlay--查看overlay版本 通过linux网站--https://elixir.bootlin.com/linux/v4.4.196/source/fs/overlayf ...

  2. Android外接USB扫码枪

    公司的设备以前接入的都是串口的扫码头,优点是直接通过串口读取流里面的数据就OK了,缺点是你需要知道每一款扫码器的型号以获取波特率及Android设备的串口地址.因为现在usb扫码器越来越方便且即插即用 ...

  3. Selenium+Java完整框架搭建(2019完整版)

    一.WebDriver框架开发实战 1.框架的思想 (1)什么是框架? 框架是可以被应用开发者定制的应用骨架 (2)为什么要写框架? 提高脚本可维护性 提高编写脚本的速度 提高脚本可阅读性 (3)框架 ...

  4. dlib-android

    https://travis-ci.org/tzutalin/dlib-android https://github.com/tzutalin/dlib-android-app https://git ...

  5. 配置Pods和containers--为Containers和Pods分配内存资源

    指定内存请求和内存限制 要为容器指定内存请求,在容器的资源清单中使用resources:requests字段.要指定内存限制,使用resources:limits. memory-request-li ...

  6. shell基础知识5-函数

    函数的定义 function fname(){ } 或者 function_name(){ } 对于简单的函数,甚至可以是这样做 fname() { statement; } 函数调用 直接写函数名即 ...

  7. BlackBerry Key2 键盘扩展

    概述 BlackBerry Key2 键盘扩展是为BlackBerry Key2输入物理键盘上缺少的键而制作的输入法. BlackBerry Key2键盘和内置输入法是为商业环境而设计的,缺少桌面计算 ...

  8. centos7 spark2.3.1集群搭建

    1.安装jdk 2.安装scala 参照jdk的安装 3.ssh 免密码登录 4.安装hadoop 以上四步请参照   centos7 安装hadoop2.7.6(分布式) 5.安装spark  1) ...

  9. VMnet1、VMnet8到底是什么?

    当我们安装VMware Workstation后,在宿主机(物理电脑)上会多出两个网卡,VMNet1.VMNet8,在虚拟机设置里会多出一个配置 VMNet0. vmnet1和vmnet8是两个虚拟网 ...

  10. ECharts 避免变窄

    var roomPercentChart = echarts.init(document.getElementById('room_percent')); function ajaxGetRoomPe ...