ATM
承接上文软件开发目录规范
**软件开发目录规范(仅供参考,没有统一标准)**
假设我要开发一个叫ATM软件
ATM为顶级目录名字
# 执行程序放在bin(binary)下面
# conf 配置文件——》定制化的文件(比如产生的日志放在一个路径下面)
# core 核心代码 ,被导入的模块丢这里
# lib 共享一些功能 库(模块),自定义的库,存放功能的仓库
# logs 专门存放日志的文件夹
# readme 说明手册
bin目录下start.py文件(未改动)
执行程序放在bin下面
import sys
sys.path.append(r'D:\PycharmProject\s14\week03\day05分支\ATM')
from core.src import run
if __name__ == '__main__':
run()
conf目录下settings.py(#内容——>原文件内容)
**知识点**
# BASE_DIR 返回路径中的目录部分
# print(__file__) 当前文件的绝对路径
# os.path.dirname(__file__) 返回脚本路径
**举例说明**
内容
import os #导入标准库os(操作系统接口模块)
1. print(__file__)
2. print(os.path.dirname(__file__))
3. print( os.path.dirname(os.path.dirname(__file__)))
对应结果:
1. D:\PycharmProject\ATM\conf\settings.py
2. D:\PycharmProject\ATM\conf
3. D:\PycharmProject\ATM
# # 配置文件——》定制化的文件(比如产生的日志放在一个路径下面)
#
#
# import os
#
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
#
# LOG_PATH = r'%s\logs\access.log' % BASE_DIR
#
# # 配置路径写活了
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOG_PATH = r'%s\logs\access.log' % BASE_DIR
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'格式1': {
'format': '%(asctime)s %(name)s %(filename)s:%(lineno)d %(levelname)s:%(message)s'
},
'格式2': {
'format': '%(asctime)s :%(message)s'
},
},
'filters': {},
'handlers': {
'屏幕': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': '格式2'
},
'文件': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'formatter': '格式1',
'filename': LOG_PATH,
'encoding': 'utf-8',
},
},
'loggers': {
'交易日志': {
'handlers': ['屏幕','文件'],
'level': 'DEBUG',
'propagate': False,
},
'': {
'handlers': ['屏幕','文件'],
'level': 'DEBUG',
'propagate': False,
},
},
}
core目录下src.py(#内容——>原文件内容)
# core 核心代码 ,被导入的模块丢这里
# from lib.common import log
#
#
# def logout():
# print("退出".center(50,'*'))
# exit()
#
# def login():
# print('登录'.center(50,'*'))
# log("egon刚刚登录了")
#
# def register():
# print('注册'.center(50,'*'))
#
# def transfer():
# print('转账'.center(50,'*'))
# log("egon刚刚给刘sir转了10个亿")
#
# def withdraw():
# print('提现'.center(50,'*'))
#
# def pay():
# print('支付'.center(50,'*'))
#
#
# func_dic = {
# '0': ['退出',logout],
# '1': ['登录',login],
# '2': ['注册',register],
# '3': ['转账',transfer],
# '4': ['提现',withdraw],
# '5': ['支付',pay],
# }
#
# def run():
# while True:
# for k in func_dic:
# print(k,func_dic[k][0])
#
# choice = input("请输入指令编号: ").strip()
#
# if choice in func_dic:
# func_dic[choice][1]()
# else:
# print("输入的指令错误")
from lib.common import log
def logout():
print("退出".center(50,'*'))
exit()
def login():
print('登录'.center(50,'*'))
log("egon刚刚登录了","登录日志","info")
def register():
print('注册'.center(50,'*'))
def transfer():
print('转账'.center(50,'*'))
log("egon刚刚给刘sir转了10个亿","交易日志",'info')
def withdraw():
print('提现'.center(50,'*'))
log("egon提现了10个亿","交易日志",'info')
def pay():
print('支付'.center(50,'*'))
log('egon支出失败',"交易日志",'error')
func_dic = {
'0': ['退出',logout],
'1': ['登录',login],
'2': ['注册',register],
'3': ['转账',transfer],
'4': ['提现',withdraw],
'5': ['支付',pay],
}
def run():
while True:
for k in func_dic:
print(k,func_dic[k][0])
choice = input("请输入指令编号: ").strip()
if choice in func_dic:
func_dic[choice][1]()
else:
print("输入的指令错误")
lib目录下common.py(#内容——>原文件内容)
# import time
# from conf import settings
#
# def log(msg):
# with open(r'%s' % settings.LOG_PATH,mode='at',encoding='utf-8') as f:
# f.write("%s %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"),msg))
#
# 日志路径换成 配置文件可定制
#
import time
import logging.config
from conf import settings
logging.config.dictConfig(settings.LOGGING_DIC)
def log(msg,name,level='info'):
logger = logging.getLogger(name)
if level == 'info':
logger.info(msg)
elif level == 'warn':
logger.warning(msg)
elif level == 'error':
logger.error(msg)
elif level == 'critical':
logger.critical(msg)