模块被当做执行文件直接运行的时候,和模块被导入使用时,这个模块有两个名字
被当做执行文件是名字为__main__ 被导入使用时名字是他自己的模块名
首次导入包发生的事情:
1、运行包下的__init__.py文件,创建一个包的名称空间,将__init__.py运行过程中产生的名字全部丢入名称空间里
2、在当前名称空间中得到一个名字aaa,改名字是指向包名称空间
什么是包?
包就是一个文件夹,同时也是一种模块,他可以直接当做模块使用
如何用包?
包其实就是一种拥有模块的文件夹,如果想要使用,正确的导入就可以使用
为什么要用包
为了方便程序设计者管理文件,分门别类的对多个模块进行管理
包的总结:
导包就是就是导入包下的__init__.py文件,所以对__init__.py进行操作就行
包内的导入用相对导入,而且相对导入只能在包内使用,且…不能出包
使用语句中的点代表的是访问属性:
m.n.x----->向m要n,向n要x
而导入语句中的点代表的是路径分隔符的意思
import a.b.c -----> a/b/c, 文件夹下a下有子文件夹b,文件夹b下有子文件或文件夹c
所导入语句中点的左边必须是一个包
包的诞生
并不是一次诞生的,随着功能的增加,产生了多个py文件,为了方便管理才诞生的包
这样包的使用者和设计者用起来都会方便很多
常用模块的使用:
logging
CRITICAL = 50 #FATAL = CRITICAL
ERROR = 40 错误日志
WARNING = 30 #WARN = WARNING 警示日志 提醒运维人员处理问题
INFO = 20 #程序正常运行的信息日志
DEBUG = 10 # 调试日志 软件设计者调试软件,程序运维人员维护软件看的
NOTSET = 0 #不设置
logger是自下而上的,也就是说如果级别越低,放行的内容越多
logger日志定义模板:
standard_format = '%(asctime)s %(filename)s:%(lineno)d %(name)s %(levelname)s %(message)s' #正常格式
simple_format = '%(asctime)s %(message)s' #简单格式
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {
},
'handlers': {
#打印到文件的日志,收集info及以上的日志
'file1': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'formatter': 'standard',
'filename': 'a1.log',
'encoding': 'utf-8',
},
'file2': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'formatter': 'standard',
'filename': 'a2.log',
'encoding': 'utf-8',
},
#打印到终端的日志
'stream': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'可以放任何内容,如果不写,则可以接受任何内容': {
'handlers': ['file1','file2','stream'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'ERROR', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
},
'提示日志': {
'handlers': ['stream'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
},
},
}
logger 日志的调用模板:
mport settings
import logging.config
def get_logger(name):
logging.config.dictConfig(settings.LOGGING_DIC)
return logging.getLogger(name)
#导入日志模块,同时将日志功能定义为一个函数
logger1 = get_logger("用户交易")
logger1.debug("调试日志")
logger1.info("egon给lxx转了1个亿")
logger1.warning("警告")
logger1.error("错误")
logger1.critical("危机")
调用日志函数