软件开发目录规范
软件开发目录规范
软件开发的目录规范:
为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可,假设你的软件名为foo,笔者推荐目录结构如下
Foo/ |-- core/ | |-- core.py | |-- api/ | |-- api.py | |-- db/ | |-- db_handle.py | |-- lib/ | |-- common.py | |-- conf/ | |-- settings.py | |-- run.py |-- setup.py |-- requirements.txt |-- README
解释一下:
• core/: 存放业务逻辑相关代码
• api/: 存放接口文件,接口主要用于为业务逻辑提供数据操作。
• db/: 存放操作数据库相关文件,主要用于与数据库交互
• lib/: 存放程序中常用的自定义模块
• conf/: 存放配置文件
• run.py: 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤
• setup.py: 安装、部署、打包的脚本。
• requirements.txt: 存放软件依赖的外部Python包列表。
• README: 项目说明文件。
除此之外,有一些方案给出了更加多的内容,比如LICENSE.txt,ChangeLog.txt文件等,主要是在项目需要开源时才会用到,请读者自行查阅。
关于README的内容,这个应该是每个项目都应该有的一个文件,目的是能简要描述该项目的信息,让读者快速了解这个项目。它需要说明以下几个事项:
1、软件定位,软件的基本功能; 2、运行代码的方法: 安装环境、启动命令等; 3、简要的使用说明; 4、代码目录结构说明,更详细点可以说明软件的基本原理; 5、常见问题说明。
举例说明:数据准备如下
# src.py存放源码 # encoding=utf-8 # auther:lsj def exit(): print("退出功能") def login(): print("登录功能") def register(): print('注册功能') def witdraw(): print('体现功能') def transfer(): print("转账功能") func_dic={ '0':['退出',exit], '1':['登录',login], '2':['注册',register], '3':['体现',witdraw], '4':['转账',transfer], } 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("请重新输入") # run()
# start.py存放执行程序 # encoding=utf-8 # auther:lsj # 使用相对导入:参照当前所在文件夹 # from ..core.src import run # run() # ImportError: attempted relative import with no known parent package # 执行文件超出了查找范围。 # 应该采用绝对导入-->sys.path-->执行文件 # import sys # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM\core') # import src # src.run() # 考虑问题:我们目前把路径写死了 # import sys # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM\core') # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM\lib') # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM\db') # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM\conf') # # import src # src.run() # 查看路径都是重复的,我们进行优化:把环境的顶级目录加入到环境变量 # import sys # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM') # from conf import settings # from core import src # from db import db_handle # from lib import common # print(settings) # print(src) # <module 'conf.settings' from 'D:\\pycharm\\oldboy_29\\day021\\ATM\\conf\\settings.py'> # <module 'core.src' from 'D:\\pycharm\\oldboy_29\\day021\\ATM\\core\\src.py'> # from core import src # src.run() # 不加任何前缀直接运行run(),优化如下 # from core.src import run # run() # 优化一 # import sys # print(__file__) # 获取当前文件的绝对路径:运行结果D:/pycharm/oldboy_29/day021/ATM/bin/start.py # # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM') import os # print(__file__) # 获取当前文件的绝对路径,D:/pycharm/oldboy_29/day021/ATM/bin/start.py # print(os.path.dirname(__file__)) # 获取当前文件的绝对路径的上一个文件,D:/pycharm/oldboy_29/day021/ATM/bin # print(os.path.dirname(os.path.dirname(__file__))) # D:/pycharm/oldboy_29/day021/ATM # # sys.path.append(r'D:\pycharm\oldboy_29\day021\ATM') # 优化二 import os,sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) from core import src src.run() """运行结果如下 0 退出 1 登录 2 注册 3 体现 4 转账 请输入指令编号: """
# commonpy文件的代码 import time from conf import settings def logger(msg): # 日志记录功能 with open(settings.LOG_PATH, mode='at', encoding='utf-8' ) as f: f.write('%s %s\n'%(time.strftime('%Y-%m-%d %H:%M:%S'),msg)) # 日志路径不能写死,你要给用户选择自定义的保存位置,去settings里面设置
# settings.py文件 from core import src # 这里的路径写死了,我们优化一下 # LOG_PATH = r'D:\pycharm\oldboy_29\day021\ATM\log\user.log' import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) LOG_PATH = r'%s/log/user.log' %BASE_DIR