包
import 方式
所有对包的操作,都相当于对包下的__init__
操作
from a.b.c import d
b 必须 是包 import 最后只有一个层级
相对导入 . 代表当前路径, .. 代表父级路径
logging日志
# 旗舰版## 旗舰版loggingimport osimport logging.config## 定义三种输出格式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_format = '[%(levelname)s][%(asctime)s] %(message)s'## 目录 路径logfile_dir = os.path.dirname(os.path.abspath(__file__))logfile_name = 'log1.log'logfile_name_boss = 'boss.log'## 如果不存在定义的日志目录就创建一个if not os.path.isdir(logfile_dir): os.mkdir(logfile_dir)# log 文件的全路径logfile_path = os.path.join(logfile_dir,'logs',logfile_name)logfile_path_boss = os.path.join(logfile_dir,'boss',logfile_name_boss)## log配置字典LOGGING_DIG= { 'version':1, 'disable_existing_loggers':False, 'formatters':{ ## 配置相应格式化 'standard':{ 'format':standard_format }, 'simple':{ 'format':simple_format }, 'easy':{ 'format':id_simple_format } }, 'filters':{}, 'handlers':{ ## 配置句柄 文件 或者 控制台 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter':'simple' }, 'default':{ 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', ## 轮换着保存到文件 'formatter':'standard', 'filename':logfile_path, # 文件名字 绝对路径 'maxBytes':1024*1024*5, ## 单文件最大大小 字节 'backupCount':5, ## 最多多少个文件 'encoding':'utf-8' }, 'sb_boss':{ 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', ## 轮换着保存到文件 'formatter':'easy', 'filename':logfile_path_boss, # 文件名字 绝对路径 'maxBytes':1024*1024*5, ## 单文件最大大小 字节 'backupCount':5, ## 最多多少个文件 'encoding':'utf-8' } }, 'loggers':{ #对象 '':{ 'handlers':['default','console','sb_boss'], 'level':'DEBUG', 'propagate':True } }}def load_my_logging_cfg(task_id): logging.config.dictConfig(LOGGING_DIG) ## 添加配置 logger = logging.getLogger(task_id) ## 任务标识 return loggerif __name__ == '__main__': logger = load_my_logging_cfg('购物车') ##这是使用,这个部分可以包装成函数 logger.info('it works')