• 模块下篇————包和模块


    logging模块

    用于便捷记录日志且线程安全的模块 logging模块的几种等级

    默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

    level = logging.DEBUG设置日志级别 import logging

    logging.basicConfig(filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
                    detefmt='%Y-%m-%d %H:%M:%S %p',
                    level = logging.DEBUG)
    
    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')
    

    logger对象配置

    import logging
    
    logger = logging.getLogger()
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('test.log')
    
    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    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')
    

    format 设置输出格式

     %(levelno)s: 打印日志级别的数值
     %(levelname)s: 打印日志级别名称
     %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
     %(filename)s: 打印当前执行程序名
     %(funcName)s: 打印日志的当前函数
     %(lineno)d: 打印日志的当前行号
     %(asctime)s: 打印日志的时间
     %(thread)d: 打印线程ID
     %(threadName)s: 打印线程名称
     %(process)d: 打印进程ID
     %(message)s: 打印日志信息
    

    datefmt 设置日期格式,同 time.strftime()

      %Y 年 %m 月  %D日  %H时  %M分  %S 秒
    

    filename 设置文件路径

    filemode 设置文件打开模式

    注:没有filename和filemode直接输出

    序列化模块

    json用于【字符串】和【python基本数据类型】间进行转换 (数据交互),可以进行多种语言的数据交互

    Json模块提供了四个功能:dumps、dump、loads、load 无s的区别,应用于文件的操作

    import json
    # json的用法
    dic = {"name":"alex"}
    data = json.dumps(dic)
    print(data)
    print(type(data))
    with open("hello","w") as f:
        f.write(data)
    
    
    with open("hello","r") as new_f:
        i = new_f.read()
        a = json.loads(i)
        print(type(i))
        print(type(a))
    
    {"name": "alex"}
    <class 'str'>
    <class 'str'>
    <class 'dict'>
    

    json里面都会变为双引号的字符串,json不认单引号。

    Pickle的问题和所有其他编程语言特有的序列化问题一样,就是只能作用python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

    import pickle                # 和json的方法的相同,序列化对象
    dic = {"name":"alex"}
    # data = pickle.dumps(dic)   # 转化为字节类型
    # print(data)                # ---><class 'bytes'>
    
    f = open("hello","wb")
    f.write(pickle.dumps(dic))   #
    f.close()
    
    f = open("hello","rb")      # 反序列化
    data = pickle.loads(f.read())# 相当于data = pickle.load(f)
    print(data)
    f.close()

    包和模块

    模块搜索

    python解释器在import模块时必须先找到对应的模块文件
    程序的主目录
    pythonpath目录(如果设置了此变量)
    标准链接库目录
    任何.pth文件的内容(如何存在.pth文件)
    这四个组件组合起来即为sys.path所包含的路径,而python会选择在搜索路径中的第一个符合导入文件名的文件

    python包

    包用于将一组模块归并到一个目录中,此目录即为包,目录名即为包名 包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境
    基于包,python在执行模块导入时可以指定模块的导入路径
    import dir1.dir2.mod1

    python包

    要使用如图所示的package1,则pypkgmod容器必须要在模块搜索路径中 import package1.mod1
    包导入语句的路径内的每个目录内都必须有init.py文件
    init.py可包含python代码,但通常为空,仅用于扮演包初始化的挂钩、替目录产生模块命名空间以及使用目录导入时实现from *行为的角色 

    模块的顶层执行及被导入

    一个模块文件可以同时支持顶层执行(作为顶层文件)或被导入(作为模块文件) 
    每个模块都有个名为name的内置属性,python会自动设置该属性 
    如果文件是以顶层程序文件执行,在启动时,name的值为“main” 如果是被导入,则name的值为模块名
    可以在模块文件中检测自己的name属性,以之实现在执行时运行指定的代码
    常用于2模块的自我测试

    #!/usr/bin/python
    def testFunc():
        print('hello threr...')
    if __name__ == "__main__":
    testFunc()
    

    发布python模块或程序
    python模块、扩展和应用程序可以按一下几种形式进行打包和发布 压缩文件(使用distutils)
    Windows的zip文件和类Unix平台的.tar.gz文件
    自动解包或自动安装可执行文件
    Windows中的.exe文件
    自包含的,不要求安装的预备运行可执行程序
    Windows的.exe文件、Unix上带有一个小的脚本前缀的ZIP压缩文件、Mac上的.app文件等
    平台相关的安装程序
    Windows上的.msi文件、Linux上常见的.rpm、src.rpc和.deb文件等 Python eggs
    较流行的第三方扩展

    使用disutils发布模块
    distutils模块能够帮助完成模块或程序发布
    "发布"是指一个文件集合,这些文件联合在一起可使用distutils构建、打包和发布模块
    创建好的发布可以用于安装,也可上传到PyPI与他人共享
    创建发布
    将各代码文件组织到模块容器中
    准备一个README或README.txt文件 
    而后在容器中创建setup.py文件

    from distutils.core import setup
    setup(
    name        = 'testmod',
    version     = '0.0.1',
    author      = 'NuanYang',
    author_email    = '524067016@qq.com',
    py_modules  = ['testmod'],
    url         = 'http://www.python.org',
    description = 'A simple module.',
    )

    setup.py的常用参数
    将各代码文件组织到模块容器中,而后在容器中创建setup.py文件

    参数              描述
    name            包的名称(必需)
    Version         版本号(必需)
    author          作者名称
    author_email        作者的电子邮件地址
    maintainer      维护者的名称
    maintainer_email    维护者的电子邮件地址
    url             包的主页
    description     包的简短描述
    long_description    包的详细描述
    download_url        包的下载位置
    Classifiers     字符串分类器列表
    
    setup.py中setup()中可用参数:
    
    platforms           平台列表
    license         许可证
    py_modules      各模块名称组成的列表,此写模块可能位于包的根目录下,也可能位于某子包目录中(subpkg1.modname):  
    packages            各子包名称的列表  
    
    大体分为两类:元数据信息和包中的内容列表
    
    完成打包 在要发布的容器目录中执行“python setup.py sdist”命令
    python.exe setup.py sdist
    
    python setup.py sdist 
    可以为sdist指定格式:
    
    zip: zip file
    gztar: tar.gz file
    bztar: tar.bz2 file
    ztar: tar.Z file
    tar: tar file
    
    python setup.py bdist #二进制版本 要以为bdist指定的格式:
    
    gztar: tar.gz file
    ztar: tar.Z file
    tar: tar file
    zip: zip file
    rpm: RPM Package
    pkgtool: Solarls pkgtool
    wininst: Windows上自解压的zip格式的包
    msi: Microsoft Installer
    bdist_d
  • 相关阅读:
    (x^n-1)在实数域上的标准分解
    子数列收敛定理(任何有界数列必有收敛子数列)
    Islamic empire
    Cauchy收敛准则
    Islamic
    用上下极限判定数列的算数平均值的极限
    妞妞打车之最多的硬币
    信仰1056
    棋盘游戏
    取石子的游戏
  • 原文地址:https://www.cnblogs.com/songcheng/p/7119286.html
Copyright © 2020-2023  润新知