---恢复内容开始---
---title: 标准目录规范
date: 2018-10-15 15:26:37
categories:python
tags:python入门
一.标准目录规范
我们学习了模块和包以后,在开发项目就不应该在是面条版,应该分为文件/文件夹,那么有没有什么固定的文件结构呢?答案是:有的!这就是我们所说的开发目录规范。
我们通过一些列子来说明这些文件夹的作用
eg:编写ATM
#file:'start.py'
def login():
# load file
with open('/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt')as f:
print(f.read())
def register():
print('register')
def run():
while True:
print('''1.login 2.reginster ''')
choice = input('please choice:
')
if choice == '1':
login()
elif choice == '2':
register()
else:
print('choice error')
在这个ATM中我们时常要使用到的文件路径,例如日志文件,数据文件等,并且不止一个地方用,如果直接写在code中,是不可取的,因为不可避免的要修改这些路径。
所以,这些文件路径不要直接卸载code中,那么应该怎么做?定义为变量可行吗?当然可行,如此一来,修改的时候只要修改一次就可以了。
# file:'start.py'
# data
DB_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
def login():
# load file
with open(BD_PATH)as f:
print(f.read())
def register():
print('register')
def run():
while True:
print('''1.login 2.register''')
choice = input('please choice:
')
if choice == '1':
login()
if choice == '2':
register()
else:
print('choice error')
但是当你想一想,此类用于配置程序的变量时,应该和你的业务逻辑放在一起吗?显然不应该,所以我们要将用于配置的信息单独放在一个文件中
# file:'setting.py'
# data
DATA_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
2.在接下我们需要实现一个道理验证的功能,那这个功能,需要在所有关键操作之前进行验证,也就是很多功能中都要调用这个功能,由于start中代码太多,我们要进行拆分,这样一来,这个登录验证的code我们可以将其放置于一个公共的common中
common.py
# login 装饰器
def login_auth():
pass
3.除此以外,我们还有日志文件log,数据文件db;
4.另外我们可以将程序的业务逻辑和启动code进行分离,变成start文件和src文件,其中
①start.py文件专门用于执行启动;
②scr中的逻辑code用来被start调用
这样用户使用时就能很快定位到启动文件
5.在一个项目中,可能有多个执行文件,那么我们可以统一到bin文件夹中
综上所述:一个规范的项目目录应包含以下结构:(除readme以外都是文件夹)
bin
core
conf
lib
db
log
readme(介绍文件)
problem:这里的文件夹是普通文件夹还是包?
1.先明确普通文件夹和包的区别
包与普通文件夹的区别是包是含有init文件的,而init文件的作用就是将文件夹中的所有模
块导入到init中,调用包实质也是调用init文件中的功能。
2.判断每一个文件夹是否需要init这个功能
bin:执行文件夹,所以不需要被导入
conf:配置文件夹,在一个项目中,不可能只有一个配置文件,比如mysql,oracle,他
们不是一家,如果把他们的配置全部集中到init文件中,这样显然不合适。所以不需
要init的功能,不需要做包
core:业务逻辑文件夹,里面一定有一个用户的入口,用户进入以后只是在这些不同业务
中来回执行操作,所以这个文件夹下的模块是相互调用的关系,不需要集合所有功
能给外界调用,所以不需要做成包。
db,lib,log:很明显不需要
3.那么什么样的code该定义为包呢?
例如你有一个下载我呢见的模块,这里面可能用到了网络请求叫request.py,还有文件操
作fileopt.py那么就应该定义为包,因为这两个文件中的功能都是给别人调用的!
综上所述:
项目标准结构的第一层仅仅是文件夹,不是包
二.定制程序入口
继续完善程序,使其可以展示用户功能界面,在src中定义run函数,用来启动程序,注意src所
在的code中可能有多个文件,用户在使用时不方便,所以我们的程序的入口从src中转移到start.py
中。
在start.py中导入core下的src并执行run
# file:'start.py'
import core.src
core.src.run()
由于core这个模块并不存在于环境变量中,所以程序无法运行,所以:
第一步:在环境变量中添加core
#file:'start.py'
import sys
sys.path.append(r"C:\yyhpythonday20ATMcore")
import core.src
core.src.run()
程序执行成功,但是以上写法存在两个问题
1.除了core,其他的lib,conf就无法使用
2.如果用户的安装路径不同,程序也无法运行
为了能够找到所有模块,我们把ATM文件夹加入化境变量
# file:'start.py'
import sys
sys.path.append((r"C:\yyhpythonday20ATMcore")
为了不同安装路径,程序也能运行,此时我们需要动态的获取单枪项目的目录
在一个py文件中可以使用file来获取当前文件的路径
通过当前文件路径来获取文件所在的目录,使用os.path.dirname
第二步:最终code
# file:'start.py'
import sys,os
BASE_DIR = os.path.dirname(os.path.dirnaem(__file__)))
sys.path.append(BASE_DIR)
import core.src
core.src.run()
三.使用标准目录后
1.引用配置文件
在上述案例中,我们把我呢见的路径定义为变量并放在setting.py文件中,那么在src中要使用这
些变量,就需要导入conf下的setting.py
由于在启动文件start.py文件中我们已经将项目根目录添加到path中,所以可以直接导入
# file:'src.py' 部分code
# 导入配置
from conf import setting
def login():
# load file 并且使用配置文件中的路径
with open(setting.BD_PATH) ad f:
print(f.read())
def register():
print('register')
2.引用自定义模块
为上述案例添加日志功能
# file:'src.py'部分code
# log
def logger(msg):
with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')
f.write(msg)
# load setting file
from conf import setting
with open(setting.DB_PATH)as f:
print(f.read())
logger('xxx login system')
def register():
print('register')
日志功能并不是只有src文件使用,所以我们将它提取为单独的模块
在lib下的common中
# file:'src.py' 部分code
# 导入配置文件获取,日志路径
from conf import setting
# 日志功能
def logger(msg):
with open(setting.LOG_PATH) as f:
f.write(msg)
在src中导入日志模块
# file:'src.py'部分code
from lib import common
# log功能
def logger(msg):
with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')as f:
f.write(msg)
# 导入配置文件
from conf import setting
def login():
# 加载文件 使用配置文件中的路径
with open(setting.DB_PATH) as f:
print(f.write(msg))
logger('xxx login system)
def register():
print('register')
---恢复内容结束---
---title: 标准目录规范
date: 2018-10-15 15:26:37
categories:python
tags:python入门
一.标准目录规范
我们学习了模块和包以后,在开发项目就不应该在是面条版,应该分为文件/文件夹,那么有没有什么固定的文件结构呢?答案是:有的!这就是我们所说的开发目录规范。
我们通过一些列子来说明这些文件夹的作用
eg:编写ATM
#file:'start.py'
def login():
# load file
with open('/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt')as f:
print(f.read())
def register():
print('register')
def run():
while True:
print('''1.login 2.reginster ''')
choice = input('please choice:
')
if choice == '1':
login()
elif choice == '2':
register()
else:
print('choice error')
在这个ATM中我们时常要使用到的文件路径,例如日志文件,数据文件等,并且不止一个地方用,如果直接写在code中,是不可取的,因为不可避免的要修改这些路径。
所以,这些文件路径不要直接卸载code中,那么应该怎么做?定义为变量可行吗?当然可行,如此一来,修改的时候只要修改一次就可以了。
# file:'start.py'
# data
DB_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
def login():
# load file
with open(BD_PATH)as f:
print(f.read())
def register():
print('register')
def run():
while True:
print('''1.login 2.register''')
choice = input('please choice:
')
if choice == '1':
login()
if choice == '2':
register()
else:
print('choice error')
但是当你想一想,此类用于配置程序的变量时,应该和你的业务逻辑放在一起吗?显然不应该,所以我们要将用于配置的信息单独放在一个文件中
# file:'setting.py'
# data
DATA_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
2.在接下我们需要实现一个道理验证的功能,那这个功能,需要在所有关键操作之前进行验证,也就是很多功能中都要调用这个功能,由于start中代码太多,我们要进行拆分,这样一来,这个登录验证的code我们可以将其放置于一个公共的common中
common.py
# login 装饰器
def login_auth():
pass
3.除此以外,我们还有日志文件log,数据文件db;
4.另外我们可以将程序的业务逻辑和启动code进行分离,变成start文件和src文件,其中
①start.py文件专门用于执行启动;
②scr中的逻辑code用来被start调用
这样用户使用时就能很快定位到启动文件
5.在一个项目中,可能有多个执行文件,那么我们可以统一到bin文件夹中
综上所述:一个规范的项目目录应包含以下结构:(除readme以外都是文件夹)
bin
core
conf
lib
db
log
readme(介绍文件)
problem:这里的文件夹是普通文件夹还是包?
1.先明确普通文件夹和包的区别
包与普通文件夹的区别是包是含有init文件的,而init文件的作用就是将文件夹中的所有模
块导入到init中,调用包实质也是调用init文件中的功能。
2.判断每一个文件夹是否需要init这个功能
bin:执行文件夹,所以不需要被导入
conf:配置文件夹,在一个项目中,不可能只有一个配置文件,比如mysql,oracle,他
们不是一家,如果把他们的配置全部集中到init文件中,这样显然不合适。所以不需
要init的功能,不需要做包
core:业务逻辑文件夹,里面一定有一个用户的入口,用户进入以后只是在这些不同业务
中来回执行操作,所以这个文件夹下的模块是相互调用的关系,不需要集合所有功
能给外界调用,所以不需要做成包。
db,lib,log:很明显不需要
3.那么什么样的code该定义为包呢?
例如你有一个下载我呢见的模块,这里面可能用到了网络请求叫request.py,还有文件操
作fileopt.py那么就应该定义为包,因为这两个文件中的功能都是给别人调用的!
综上所述:
项目标准结构的第一层仅仅是文件夹,不是包
二.定制程序入口
继续完善程序,使其可以展示用户功能界面,在src中定义run函数,用来启动程序,注意src所
在的code中可能有多个文件,用户在使用时不方便,所以我们的程序的入口从src中转移到start.py
中。
在start.py中导入core下的src并执行run
# file:'start.py'
import core.src
core.src.run()
由于core这个模块并不存在于环境变量中,所以程序无法运行,所以:
第一步:在环境变量中添加core
#file:'start.py'
import sys
sys.path.append(r"C:\yyhpythonday20ATMcore")
import core.src
core.src.run()
程序执行成功,但是以上写法存在两个问题
1.除了core,其他的lib,conf就无法使用
2.如果用户的安装路径不同,程序也无法运行
为了能够找到所有模块,我们把ATM文件夹加入化境变量
# file:'start.py'
import sys
sys.path.append((r"C:\yyhpythonday20ATMcore")
为了不同安装路径,程序也能运行,此时我们需要动态的获取单枪项目的目录
在一个py文件中可以使用file来获取当前文件的路径
通过当前文件路径来获取文件所在的目录,使用os.path.dirname
第二步:最终code
# file:'start.py'
import sys,os
BASE_DIR = os.path.dirname(os.path.dirnaem(__file__)))
sys.path.append(BASE_DIR)
import core.src
core.src.run()
三.使用标准目录后
1.引用配置文件
在上述案例中,我们把我呢见的路径定义为变量并放在setting.py文件中,那么在src中要使用这
些变量,就需要导入conf下的setting.py
由于在启动文件start.py文件中我们已经将项目根目录添加到path中,所以可以直接导入
# file:'src.py' 部分code
# 导入配置
from conf import setting
def login():
# load file 并且使用配置文件中的路径
with open(setting.BD_PATH) ad f:
print(f.read())
def register():
print('register')
2.引用自定义模块
为上述案例添加日志功能
# file:'src.py'部分code
# log
def logger(msg):
with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')
f.write(msg)
# load setting file
from conf import setting
with open(setting.DB_PATH)as f:
print(f.read())
logger('xxx login system')
def register():
print('register')
日志功能并不是只有src文件使用,所以我们将它提取为单独的模块
在lib下的common中
# file:'src.py' 部分code
# 导入配置文件获取,日志路径
from conf import setting
# 日志功能
def logger(msg):
with open(setting.LOG_PATH) as f:
f.write(msg)
在src中导入日志模块
# file:'src.py'部分code
from lib import common
# log功能
def logger(msg):
with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')as f:
f.write(msg)
# 导入配置文件
from conf import setting
def login():
# 加载文件 使用配置文件中的路径
with open(setting.DB_PATH) as f:
print(f.write(msg))
logger('xxx login system)
def register():
print('register')