赞
踩
本文将为您介绍: 项目结构预备知识,基本项目结构 ,带多个子包的项目结构,Flask项目结构,机器学习项目结构等常见类型的项目结构,有疑问,欢迎留言
Package(包), Module(模块), file(文件) 三者关系,
Package由模块组成
包含功能代码的.py 代码文件也称为 module 模块, 但不能把 config.py , __init__.py
称为模块。
虽然在形式上,可以把1个包理解为1个目录,但并非是包含代码的目录都是包,
二者区分的关键是, 包目录包含 __init__.py
文件,不包含此文件的不能称之为包目录。
本文介绍的python项目结构适合于中小型项目, 应用非常广泛,初学者应该养成好习惯,一开始就用这种方式来组织自己的代码。
假设新建项目的名称为 myproject, 可以在windows或 linux终端, 创建如下项目结构
└─myproject
│ .gitignore
│ LICENSE
│ readme.md
│ requirements.txt
│ setup.py
│
├─myproject
│ main.py
│ util.py
│ __init__.py
│
└─test
test_main.py
说明如下:
第1层 myproject 是项目根目录,第2级 myproject 才是包目录,为什么这样组织,主要是基于好的实践经验,项目根目录主要用于存放配置,手册,启动文件等。 而主要功能都放在package包中,Pythton包的具体组织形式就是1个子目录,由于是基本项目,功能不多,只有1个包,因此用项目同名做为包名,所有实现代码放在 ·myproject/myproject· 目录下。
主要有几类文件:
包目录下主要有:
__init__.py
文件,(参考 Python项目中的 init.py的作用及内容 )n主要保存测试文件,都是test开头文件。
对于1个非常简单的程序 ,还可以简化为如下形式
sample/
├── .gitignore
├── LICENSE
├── README.rst
├── requirements.txt
├── sample.py
├── setup.py
└── test_sample.py
如果项目功能较多,有几个开发者,可以把项目拆分,分成几个子包来开发。在 myproject的主包目录下创建子包目录
└─myproject
│ .gitignore
│ LICENSE
│ readme.md
│ requirements.txt
│ setup.py
│
├─myproject
│ │ main.py
│ │ util.py
│ │ __init__.py
│ │
│ ├─app_sample
│ │ │ sample.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ sample.cpython-39.pyc
│ │ __init__.cpython-39.pyc
│ │
│ └─__pycache__
│ main.cpython-39.pyc
│ __init__.cpython-39.pyc
│
└─test
test_main.py
说明:
sample.py
, __init__.py
文件内容分别如下: # sample.py文件
def demo():
return "this is a demo function"
# __init__.py 文件
from .sample import demo
# 或者 from sample import *
from app_sample import *
def main():
return "main test"
print(main())
print(demo())
输出为:
main test
this is a demo function
也可以这样导入 sameple.py 中demo函数
from app_sample.sample import demo
python包管理工具,setuptools
已取代distutils
,当然也可以使用 Poetry
,python建议使用 pyproject.toml 做为打包配置文件,下面给出了1个流行的项目结构,适用于商业化Python项目。
project_root_directory
├── pyproject.toml # 项目配置文件,或者使用 setup.cfg, setup.py
├── ... # 如 readme.rst, license等
└── src/
└── mypkg/
├── __init__.py
├── ...
├── module.py
|---- data
| |----- data1.json
| |---- data2.xml
├── subpkg1/
│ ├── __init__.py
│ ├── ...
│ └── module1.py
└── subpkg2/
├── __init__.py
├── ...
└── module2.py
上述结构中,mypkg下还包含1个data文件夹,包含了项目使用的数据文件,当然也可以添加更多公共文件夹,如 static/,/meida/, log/ 等.
可以在pyproject.toml
添加模块搜索路径以及数据文件配置
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
"*" = ["*.txt"]
mypkg = ["*.json","*.xml"]
与django
不同, django-admin startproject
可自动生成项目结构,而Flask
项目结构需要自己来构建,1个结构良好的项目结构形式,要考虑子应用隔离,模型,模板文件、静态文件等路径,
下面是推荐的 Flask项目结构:
flaskr-tutorial/
├── flaskr/
│ ├── ___init__.py
│ ├── db.py
│ ├── schema.sql
│ ├── auth.py
│ ├── blog.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── auth/
│ │ │ ├── login.html
│ │ │ └── register.html
│ │ └── blog/
│ │ ├── create.html
│ │ ├── index.html
│ │ └── update.html
│ └── static/
│ └── style.css
├── tests/
│ ├── data.sql
│ ├── test_auth.py
│ ├── test_blog.py
│ ├── test_conf.py
│ ├── test_db.py
│ └── test_factory.py
├── venv/
├── .gitignore
├── setup.py
└── MANIFEST.in
机器学习项目是python应用的重要方向,此类项目的特点是,需要有源数据、算法模型目录(注意不是django, flask 的模型),生产环境通常还需要集成 Flask 提供web服务,典型的项目结构如下:
sample/
├── data/
│ ├── external/
│ ├── interim/
│ ├── processed/
│ └── raw/
├── models/
├── notebooks/
├── sample/
│ ├── data/
│ ├── features/
│ └── model/
├── tests/
├── .gitignore
├── LICENSE
├── README.rst
├── requirements.txt
└── setup.py
本文描述的python最流行的基本项目结构形式,后续继续给大家介绍,多应用项目,web项目,AI类应用项目结构的建议。
关于项目打包与部署相关知识, 可参考本博主其它文章:
Python项目打包与部署(三):打包与部署的实际操作流程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。