• 模块和包,logging模块


    模块和包,logging日志

    1.模块和包

    什么是包?
    只要文件夹下含有__init__.py文件就是一个包.
    
    
    假设文件夹下有如下结构
    bake   
    	├── test.py
    
        ├── __init__.py       
    
        ├── api               
    
            ├── __init__.py
    
            ├── policy.py
    
            └── versions.py
    
      ├── cmd             
    
        ├── __init__.py
    
        └── manage.py
    
      └── db                
    
          ├── __init__.py
    
          └── models.py
            
            
    在test.py进行导入policy.py,包使用import导入
    import bake.api.policy
    bake.api.policy.get()
    导入时太长可以用as起别名
    import bake.api.policy as p
    p.get()
    
    这样的操作只支持包,普通文件夹无效
    
    想要导入某个包下的所有的模块 我们就需要在包中的__init__.py做操作
    操作如下:
    bake包下的__init__.py
    from . import api
    api包下的__init__.py
    from . import policy
    最后在test.py中
    import bake
    bake.api.policy.get()
    
    在policy文件中导入versions就是直接使用import,在policy文件使用没有问题.但是在test.py执行的时候就会报错 因为我们在test.py中执行的import versions 相当于在test.py文件进行查找,肯定不会找到,我们需要在policy文件中向sys.path添加了当前的路劲就可以了 具体操作如下:
    import os
    import sys
    sys.path.insert(os.path.dirname(__file__)
    __file__获取的是当前文件的路径,这样我们就能在test中正常使用了,我们使用from也能够将某个包下所有的模块全都导入 比如我们现在想将cmd包下的所有的模块导入需要在bake包下的__init__.py进行设置
    from . import *
    我们需要在api包下设置__init__.py
    __all__ = ["policy","versions"]
    或
    from . import policy
    from . import versions
    我们需要在db包下设置__init__.py
    __all__ = ["models"]
    或
    from . import models
    我们需要在cmd包下设置__init__.py
    __all__ = ["manage"]
    或
    from . import manage
    以上两种推荐使用下from . import manage 灵活,可读性高
    test.py调用如下
    from bake.api import *
    print(versions.name)
    policy.get()
    
    from bake.db import *
    models.register_models(123)
    
    from bake.cmd import *
    print(manage.name)      
        
    注意点:
       1.python2中如果import包,没有__init__.py文件就会报错 python3 import没有__init__.py文件的包不会报错 from 包 import 包或者模块(在import后边不能在进行.操作)  
       2.使用相对路径必须在最外层包的同级进行导入.            
    
    路径:
    绝对路径:从最外层(bake)包.查找的就是绝对路径 
    相对路径:.就是相对路径, ..是上一级目录 例如:我们在bake/api/version.py中想要导入bake/cmd/manage.py
    # 绝对路径:
    from bake.cmd import manage
    manage.main()
    
    #相对路径:
    from ..cmd import manage
    manage.main()
                    
    注意在使用相对路径的时候一定要在于bake同级的文件中测试 我们需要在和bake同级的test.py中测试
    from bake.cmd import manage
    

    2.logging日志

    logging模块,这个模块的功能是记录我们软件的各种状态
    
    函数式简单配置:(默认从warnning开始记录)
    import logging
    logging.debug('我是调试')
    logging.info('我是信息')
    logging.warning('我是警告')
    logging.error('我是错误')
    logging.critical('我是危险')
    日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG
    默认的日志格式为日志级别:Logger名称:用户输出消息。
    
    
    灵活配置日志级别,日志格式,输出位置:
    import logging
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S',
                        filename='test.log',
                        filemode='w')    
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message')
    
    basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
    -	filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    -	filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    -	format:指定handler使用的日志显示格式。
    -	datefmt:指定日期时间格式。
    -	level:设置记录日志的级别
    -	stream:用指定的stream创建StreamHandler。可以指定输出到
    sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
    
    format参数中可能用到的格式化串:
    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s用户输出的消息
    
    
    logger对象配置:
        
    import logging
    
    logger = logging.getLogger()
    # 创建一个logger
    fh = logging.FileHandler('test.log',mode="a",encoding='utf-8')   # 创建一个handler,用于写入日志文件
    ch = logging.StreamHandler()   # 创建一个handler,输出到控制台
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s - [line:%(lineno)d] -  %(levelname)s - %(message)s')
    # 将屏幕和文件都是用以上格式
    logger.setLevel(logging.DEBUG)
    # 设置记录级别
    fh.setFormatter(formatter)
    # 使用自定义的格式化内容
    ch.setFormatter(formatter)
    logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
    logger.addHandler(ch)
    
    
    logger.debug('logger debug message')
    logger.info('logger info message')
    logger.warning('logger warning message')
    logger.error('logger error message')
    logger.critical('logger critical message')
    
    
    logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。
    
  • 相关阅读:
    arrayAppend.php
    C语言中一个语句太长用什么换行?
    date
    Mysql复制一条或多条记录并插入表|mysql从某表复制一条记录到另一张表
    Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest
    javascript:location=location;">刷新</a>
    TestAbstract
    scanner=new Scanner(System.in); int i=scanner.nextInt();
    public static void Swap2
    JIRA 模块 bug管理工具
  • 原文地址:https://www.cnblogs.com/tutougold/p/11280321.html
Copyright © 2020-2023  润新知