zoukankan      html  css  js  c++  java
  • 包的使用 logging日志模块 相对导入和绝对导入

    day19

    一丶包的使用

    什么是包:

    包是通过使用 .模块名的方式组织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:s23day19相对导入绝对导入dir')

    import nb

    nb.f1()
    nb.f2()
    nb.f3()
    nb.f4()
    nb.f5()
    nb.f6()

    # 我将原包名改成了大写的NB
       import sys
       sys.path.append(r'D:s23day19相对导入绝对导入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. 记录用户信息日志:用户的消费习惯.偏好等等

    日志记录的三个版本:

    ### 简易版

    # -*-coding:utf-8-*-
    # Author:Ds
    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)

    log
    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',  # 日志文件的编码
              },
               # 打印到文件的日志,手机info及以上的日志
               '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

     

  • 相关阅读:
    【MOSS】SPUser的操作
    退出登录跳出框架页
    F12转到定义时,总是显示从元数据 转载粘贴
    简易代码生成器
    C语言I博客作业04
    第一周作业
    C语言I博客作业02
    C语言I博客作业02
    【DukeImage】Week_5 Segmentation
    【LeetCode】#7 Reverse Integer
  • 原文地址:https://www.cnblogs.com/xiangwang1/p/12180036.html
Copyright © 2011-2022 走看看