各类Python项目的项目结构及代码组织最佳实践

2023-05-16

1. 了解Python项目文件组织结构非常重要

为什么要掌握pythob项目结构?

  • 优秀的程序员都使用规范的项目代码结构,了解这些好的习惯方式,能帮助你快速读懂代码
  • 如果项目是几个人合作开发,好的代码结构,便于分工,减少混乱,使项目开发过程更顺畅。

本文将为您介绍: 项目结构预备知识,基本项目结构 ,带多个子包的项目结构,Flask项目结构,机器学习项目结构等常见类型的项目结构,有疑问,欢迎留言

预备知识:Package包, Module模块与 fiile文件的关系

Package(包), Module(模块), file(文件) 三者关系,
Package由模块组成
包含功能代码的.py 代码文件也称为 module 模块, 但不能把 config.py , __init__.py称为模块。
在这里插入图片描述

预备知识: 包与目录的关系

虽然在形式上,可以把1个包理解为1个目录,但并非是包含代码的目录都是包,
在这里插入图片描述
二者区分的关键是, 包目录包含 __init__.py 文件,不包含此文件的不能称之为包目录。

2. 应用最广泛的 python 项目结构的基本形式

本文介绍的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) 项目根目录与包目录的区分

第1层 myproject 是项目根目录,第2级 myproject是包目录,为什么这样组织,主要是基于好的实践经验,项目根目录主要用于存放配置,手册,启动文件等。 而主要功能都放在package包中,Pythton包的具体组织形式就是1个子目录,由于是基本项目,功能不多,只有1个包,因此用项目同名做为包名,所有实现代码放在 ·myproject/myproject· 目录下。

2) 项目根目录

主要有几类文件:

  • setup.py 文件, 这是要安装的包信息
  • 项目说明, readme.md , readme.rst 等。
  • requirements.txt, 第3方依赖库列表
  • License, 许可说明文件
  • .gitignore 如果使用git 做为仓库,这个文件说明哪些文件不上传

3) 包目录

包目录下主要有:

  1. 包目录下还必须有1个__init__.py文件,(参考 Python项目中的 init.py的作用及内容 )n
  2. python实现代码 .py文件。

4) test目录

主要保存测试文件,都是test开头文件。

3. 再简化:命令行式项目的结构

对于1个非常简单的程序 ,还可以简化为如下形式

sample/
├── .gitignore
├── LICENSE
├── README.rst
├── requirements.txt
├── sample.py
├── setup.py
└── test_sample.py
  1. 带子应用的项目结构

如果项目功能较多,有几个开发者,可以把项目拆分,分成几个子包来开发。在 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

说明:

  1. 子包目录的sample.py, __init__.py文件内容分别如下:
 # sample.py文件
 def demo():
    return "this is a demo function"

# __init__.py 文件
from .sample import demo 
# 或者 from sample import * 
  1. 在myproject/main.py中
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

4. Flask 项目结构

与django有项目结构生成工具不同,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

5. 机器学习项目结构

机器学习项目是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类应用项目结构的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

各类Python项目的项目结构及代码组织最佳实践 的相关文章

随机推荐

  • 华为Atlas200DK环境配置指南(版本20.0.0)

    官方参考文档 https support huaweicloud com usermanual A200dk 3000 atlas200dk 02 0024 html 务必保证配置时版本 20 0 0 一致 1 配置开发环境 自己电脑 若不
  • 软件工程(速成)——第三章 需求分析

    一 需求分析 1 需求分析的概念与任务 xff1a 需求分析是软件定义时期的最后一个阶段 xff0c 它的基本任务是准确地回答 系统必须做什么 这个问题 二 分析建模与规格说明 需求分析应该建立三种模型 xff1a 数据模型 功能模型 行为
  • Pytorch 深度学习实战:视频自动打码

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 人脸识别 人脸识别是一门比较成熟的技术 它的身影随处可见 xff0c 刷脸支付 xff0c 信息审核 xff0c 监控搜索 xff0c
  • 基于深度学习的视觉目标跟踪方法

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 以前写过一个 自动驾驶中的目标跟踪 介绍 xff0c 这次重点放在深度学习和摄像头数据方面吧 先提一下以前说的那篇综述 xff1a 3
  • 递归解决赶鸭子问题,角骨定理

    一 题目分析 用递归方法设计下列各题 xff0c 并给出每道题目的递归出口 xff08 递归结束的条件 xff09 和递归表达式 同时考虑题目可否设计为非递归方法 xff0c 如果可以 xff0c 设计出非递归的算法 1 一个人赶着鸭子去每
  • 最详细ubuntu16.04安装nvidia显卡驱动(完全无经验小白教程)

    ubuntu16 04安装nvidia显卡驱动 1 禁用nouveau ubuntu 16 04默认安装了第三方开源的驱动程序nouveau xff0c 安装nvidia显卡驱动首先需要禁用nouveau xff0c 不然会碰到冲突的问题
  • 修改ssh端口重启服务报错error: Bind to port 8822 on :: failed: Permission denied

    root 64 BabyishRecent VM vi etc ssh sshd config root 64 BabyishRecent VM systemctl restart sshdJob for sshd service fail
  • Linux之iptables(一、防火墙的概念)

    Linux之iptables 一 防火墙的概念 防火墙的概念 一 安全技术 入侵检测与管理系统 xff08 Intrusion Detection Systems xff09 xff1a 特点是不阻断任何网络访问 xff0c 量化 定位来自
  • Python调用海康SDK对接摄像机

    以前做过的项目都是通过 ffmpeg c 43 43 来捕获摄像机的 RSTP 视频流来处理视频帧 xff0c 抽空看了一下海康的SDK说明 xff0c 使用 python ctypes方式a实现了对海康SDK DLL的调用 可以进行视频预
  • 数码管点亮顺序——有错请纠正

    找了半天没有找到 xff0c 自己试了几个数试出来了 xff0c 记这个顺序图比记编码表要快些
  • css-input的美化

    原装input很丑陋 xff0c 我们需要人工对其进行装饰才能好看哦 xff01 首先取消选中时的蓝色外边框 xff1a outline style none 若你想取消外边框 xff1a border xff1a 0 或 border x
  • echarts-横向柱状图的左侧文字左对齐设置

    在需要左对齐的Y轴中这样设置 xff0c 设置完后会发现 xff0c 文字跟圆柱重合覆盖 xff08 跟你需要的位置有区别 xff09 yAxis axisLabel margin 80 textStyle align 39 left 39
  • 12108 - Extraordinarily Tired Students(特别困的学生)

    题目 xff1a When a student is too tired he can t help sleeping in class even if his favorite teacher is right here in front
  • 1211 Problem C 营救

    营救 题目描述 铁塔尼号遇险了 xff01 他发出了求救信号 距离最近的哥伦比亚号收到了讯息 xff0c 时间就是生命 xff0c 必须尽快赶到那里 通过侦测 xff0c 哥伦比亚号获取了一张海洋图 这张图将海洋部分分化成n n个比较小的单
  • JAVA: toCharArray()类 将字符串转为数组

    public class Demo public static void main String args String str 61 34 helloworld 34 char data 61 str toCharArray 将字符串转为
  • 能赢吗?

    Description 有一堆石子 xff0c 总共有n枚 xff0c 两人轮流拿 xff0c 最少拿一枚 xff0c 最多拿k枚 xff0c 拿到最后一枚的人获胜 先手拿的人可以保证自己必胜吗 xff1f Input 第一行输入一个整数T
  • python e指数函数,常用的e指数代码

    在 python中 xff0c 有一种函数叫做e指数函数 xff08 exponential function xff09 xff0c 它的名称非常的直接 xff0c 是我们在进行数值计算时经常用到的一种函数 下面就让我们一起来学习一下这种
  • 栈的概念及性质

    栈的基本概念 栈的定义 栈是一种只能在一端进行插入或删除的线性表 其中插入被称作进栈 xff0c 删除被称作出栈 允许进行插入或删除操作的一端被称为栈顶 xff0c 另一段被称为栈底 xff0c 栈底固定不变 其中 xff0c 栈顶由一个称
  • python requests post 使用方法

    使用python模拟浏览器发送post请求 span class token keyword import span requests 1 格式request post xff1a request span class token punc
  • 各类Python项目的项目结构及代码组织最佳实践

    1 了解Python项目文件组织结构非常重要 为什么要掌握pythob项目结构 xff1f 优秀的程序员都使用规范的项目代码结构 xff0c 了解这些好的习惯方式 xff0c 能帮助你快速读懂代码如果项目是几个人合作开发 xff0c 好的代