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. Java API设计原则清单

    在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度.就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程 ...

  2. 深度排序模型概述(一)Wide&Deep/xDeepFM

    本文记录几个在广告和推荐里面rank阶段常用的模型.广告领域机器学习问题的输入其实很大程度了影响了模型的选择,因为输入一般维度非常高,稀疏,同时包含连续性特征和离散型特征.模型即使到现在DeepFM类 ...

  3. php 对接微信接口 {"errcode":41001,"errmsg":"access_token missing hint

    这里是针对所有token微信都有这种机制 1.token被多次访问无效 访问微信接口->得到token,缓存起来2小时内有效,期间2小时内每次都取缓存即可,不必每次都去微信那边兑换 问题:缓存期 ...

  4. 登陆服务器提示“You need to run "nvm install N/A" to install it before using it.”

    一.登陆服务器提示“You need to run "nvm install N/A" to install it before using it.” 二.执行命令: nvm ls ...

  5. Linux sed正则匹配删除整行

    原文内容: [root@10 tmp]# more test.log 2019-12-01 09:09:02 Failed 2019-12-01 09:12:02 Failed 2019-12-01 ...

  6. java多线程(一)创建线程的四种方式

    1.   什么是并发与并行 要想学习多线程,必须先理解什么是并发与并行 并行:指两个或多个事件在同一时刻发生(同时发生). 并发:指两个或多个事件在同一个时间段内发生. 2.   什么是进程.线程 进 ...

  7. 深度相机Astra Pro测试教程

    最近在微信群内,很多群友在群友的推荐下,购买了Astra pro的深度相机,价格地道,物超所值!群友反馈积极,所以这里出一波简单的教程.   以下内容知识抛砖引玉,主要讲解windows下和Ubunt ...

  8. 禁用 Ubuntu 18.04 Files 的 Type Ahead search 功能

    . . . . . Ubuntu 的文件浏览器(Files)提供了一个搜索的功能,叫做“Type Ahead search”.即我们在文件浏览器中输入某个文件的名字时,Files 并不是将焦点定位在某 ...

  9. LeetCode_475. Heaters

    475. Heaters Easy Winter is coming! Your first job during the contest is to design a standard heater ...

  10. 1-2docker-基本的使用

    1.Docker 官⽅提供了⼀个公共的镜像仓库 https://hub.docker.com 2.获取镜像 docker pull [选项] [Docker Registry 地址[:端⼝]/]仓库名 ...