【Python】项目结构

【Python】项目结构

  • 前言
  • 前置知识
  • Python 的基本项目结构
  • `int main()` 与 `def main()` 的区别
  • 举例:基于 KNN 的 OpenCV 数字识别的项目结构

前言

本文总结了 Python 项目结构的知识,规范项目结构能使得项目开发过程高效流畅,提升代码可读性、团队协作效率,并便于维护、扩展和共享。

参考文章:
各类 Python 项目的项目结构及代码组织最佳实践

前置知识

什么是 Package(包)

包(Package)是一个文件夹,用于存放相关模块、子包、说明文档和配置文件,通常与项目的工程文件夹相对应。包能够将相关模块按功能组织,避免文件混乱。如果你有 STM32 等项目经验,这会更易理解。
ps:
包目录中必须包含 __init__.py 文件,以表明该文件夹是包。若缺少 __init__.py,Python 将无法识别该文件夹为包,导入时会报错。
Package包与 Directories目录的区别:虽然在外观上,Package 和普通目录类似,但包目录中必须包含 __init__.py 文件,而普通目录没有这个要求。包是为了组织 Python 代码模块而存在的,是 Python 中代码管理和复用的方式。

什么是 Module(模块)

模块(Module)是 Python 中的代码文件,一般是 .py 后缀的文件,用于存放可以复用的函数、类或变量等代码。模块使代码更易管理和复用。每个 .py 文件都可以看作是一个独立的模块,可以通过 import 语句在其他代码中使用。

Package 包与 Module 模块的关系
在这里插入图片描述

Package 包可以包含多个 Module 模块。包是模块的集合,它通过将多个相关的模块组合在一起,形成一个结构化的代码体系,从而方便代码的组织、分发和复用。

__init__.py 详解

__init__.py 文件的作用是让 Python 识别某个目录为包,同时可以在其中定义一些包的初始化逻辑,例如导入子模块等。如果 __init__.py 为空,表示这是一个基础的包,包含了默认的模块结构。自 Python 3.3 之后,即使没有 __init__.py,Python 也能识别包,但为了兼容性和代码规范,通常还是建议保留该文件。

Python 的基本项目结构

假设项目名称为 myproject,一个标准的项目结构如下:

myproject/              # 根目录
│  .gitignore      
│  LICENSE           
│  readme.md          
│  requirements.txt     
│  setup.py            
│
├─myproject/            # 包目录 (项目核心模块代码)
│      main.py          # 主函数,程序的入口
│      module1.py       # 模块1代码
│      module2.py       # 模块2代码
│      __init__.py      # 初始化文件
│
└─test/                 # 测试目录test_main.py    # 测试 main.py 中的功能

项目根目录说明

  • .gitignore:用于记录不希望提交到版本控制系统(如 Git)的文件,例如虚拟环境、编译生成的文件、日志等。(Git是一个帮助多人协作开发和管理代码的工具,它可以记录每次修改)
  • LICENSE:项目的许可说明文件,定义代码的使用权限。如果是个人或比赛项目,可以省略。
  • readme.md:项目的说明文档,提供项目的基本信息、功能介绍、安装方法、使用说明等。通常是项目的第一份文档,便于其他人快速了解项目。
  • requirements.txt:列出项目所需的第三方依赖库及其版本,便于其他人通过 pip install -r requirements.txt 快速配置项目环境。
  • setup.py:一键配置项目环境的打包配置文件,定义项目的基本信息(如名称、版本、作者、依赖库等),以及指定如何将代码打包成可安装的形式。

对于比赛或小项目,项目结构可以简化,.gitignore、LICENSE、requirements.txt和 setup.py可适当忽略

包目录说明

  • 包目录 (myproject/)
    • main.py:通常是项目的主入口,用于实现项目的逻辑。
    • modulex.py:模块代码,用于实现模块的基本功能
    • __init__.py:初始化操作(如 import)

测试目录说明

  • 测试目录 (test/)
    • test_main.py:测试代码,通常以 test_ 开头,用于对项目中的模块和函数进行单元测试,确保项目的稳定性和正确性。

int main()def main() 的区别

在 C 语言中,int main() 是程序的入口。而在 Python 中,没有固定的入口函数,但通常 main.py 被作为程序的入口文件。在 PyCharm 中,新建工程时默认会创建一个 main.py 文件(PyCharm的期望入口),你可以在其中 import 其他模块并调用它们的功能。
此外,也可以在 main.py 中 def 一个 main() 函数,并通过以下方式确保该函数只有在直接运行时才会执行:

if __name__ == "__main__":main()

这种写法确保了当 Python 文件被直接执行时调用 main(),但如果文件作为模块导入时,主函数不会自动执行。

举例:基于 KNN 的 OpenCV 数字识别的项目结构

knn_digit_recognition/
├── data/                             # 数据集目录
│   ├── train_images/                 # 训练集图片
│   ├── train_labels.csv              # 训练标签(如 CSV 文件,存储图片与标签的对应关系)
│   ├── test_images/                  # 测试集图片
│   └── test_labels.csv               # 测试标签
│
├── src/                              # 源代码目录(包目录)
│   ├── __init__.py                   # 标识 src 为包,初始化代码
│   ├── preprocess.py                 # 图像预处理代码(灰度、阈值、缩放等)
│   ├── knn_model.py                  # KNN 模型代码,包括训练和预测
│   ├── utils.py                      # 辅助函数(如数据加载、文件管理等)
│   └── main.py                       # 主程序,项目入口
│
├── tests/                            # 测试代码
│   ├── test_preprocess.py            # 测试预处理模块
│   ├── test_knn_model.py             # 测试 KNN 模型
│   └── test_main.py                  # 测试主程序流程
│
├── .gitignore                        # Git 忽略文件
├── requirements.txt                  # 项目依赖项
├── README.md                         # 项目说明文档
└── setup.py                          # 安装和配置脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis pro 学习笔记

二维三维集合在一起,与arcgis不同 一、首次使用,几个基本设置 1.选项——常规里面设置自动保存时间 2.新建工程文件,会自动加载地图,可以在选项里面设置为无,以提高启动效率。 3.设置缓存位置,可勾选每次…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换(warp)。 该函数根据 ECC 标准 ([78]) 估计最优变换(warpMatri…

.vue文件中定义变量和在引用的.ts文件中定义变量的区别

在 Vue 3 项目中&#xff0c;你可以在 .vue 文件和单独的 .ts 文件中定义变量。这两种方式有一些关键的区别&#xff1a; 在 .vue 文件中定义变量 局部作用域&#xff1a; 在 .vue 文件的 <script setup> 或 <script> 标签中定义的变量&#xff0c;它们的作用域仅限…

开源项目工具:LeanTween - 为Unity 3D打造的高效缓动引擎详解(比较麻烦的API版)之二———补间动画控制API系列

1.文档中的cancel,resume,pause LeanTween.cancel ( gameObject:GameObject id:int )LeanTween.cancel ( ltRect:LTRect id:int )LeanTween.cancel ( gameObject:GameObject )LeanTween.pause ( gameObject:GameObject )LeanTween.resume ( id:int )LeanTween.resume ( game…

Redis 典型应用 - 缓存(cache)

一、什么是缓存 缓存(cache)是计算机中的⼀个经典的概念.在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅,⽅便随时读取. 这⾥所说的"触⼿可及"是个相对的概念. 对于硬件的访问速度来说,通常情况下: CPU寄存器>内存>…

第十六章 TCP 客户端 服务器通信

文章目录 第十六章 TCP 客户端/服务器通信TCP 客户端/服务器通信TCP 连接概述TCP 设备的 OPEN 命令 第十六章 TCP 客户端/服务器通信 TCP 客户端/服务器通信 本章介绍如何使用 TCP/IP 在 IRIS 数据平台进程之间设置远程通信。 IRIS 支持两种互联网协议 (IP)&#xff1a;TCP …

【数学二】线性代数-矩阵-初等变换、初等矩阵

考试要求 1、理解矩阵的概念,了解单位矩阵、数量矩阵、对角矩阵、三角矩阵、对称矩阵、反对称矩阵和正交矩阵以及它们的性质. 2、掌握矩阵的线性运算、乘法、转置以及它们的运算规律,了解方阵的幂与方阵乘积的行列式的性质. 3、理解逆矩阵的概念,掌握逆矩阵的性质以及矩阵可…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…

教程:FFmpeg结合GPU实现720p至4K视频转换

将一个 720p 的视频放大编码到 4K&#xff0c;这样的视频处理在很多业务场景中都会用到。很多视频社交、短视频、视频点播等应用&#xff0c;都会需要通过服务器来处理大量的视频编辑需求。 本文我们会探讨一下做这样的视频处理&#xff0c;最低的 GPU 指标应该是多少。利用开源…

鸿蒙进阶篇-网格布局 Grid/GridItem(二)

hello大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天让我们来继续学习鸿蒙进阶篇-网格布局 Grid/GridItem&#xff0c;上一篇博文我们已经学习了固定行列、合并行列和设置滚动&#xff0c;这一篇我们将继续学习Grid的用法&#xff0c;实现翻页滚动、自定义滚动条样式&…

React教程(详细版)

React教程&#xff08;详细版&#xff09; 1&#xff0c;简介 1.1 概念 react是一个渲染html界面的一个js库&#xff0c;类似于vue&#xff0c;但是更加灵活&#xff0c;写法也比较像原生js&#xff0c;之前我们写出一个完成的是分为html&#xff0c;js&#xff0c;css&…

自然语言处理在客户服务中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 引言 自然语言处理概述 定义…

2节串联锂电池充电管理芯片,有5V升压,9-12V降压,快充升降压

从上面第一句话我们知道了2节串联锂电池的供电电压范围是&#xff1a;6V-8.4V&#xff0c;锂电池充电管理是随着电池电压提高而增加充电电压&#xff0c;直到充满电压8.4V。如2节串联锂电池电压是6V时&#xff0c;充电管理芯片会控制充电电压如7V&#xff0c; 2节串联锂电池的电…

服务器数据恢复—EVA存储故障导致上层应用不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EVA某型号控制器EVA扩展柜FC磁盘。 服务器存储故障&检测&#xff1a; 磁盘故障导致该EVA存储中LUN不可用&#xff0c;导致上层应用无法正常使用。 服务器存储数据恢复过程&#xff1a; 1、将所有磁盘做好标记后从扩展柜中取出。硬…

加入GitHub Spark需要申请

目录 加入GitHub Spark需要申请 GitHub Spark 一、产品定位与特点 二、核心组件与功能 三、支持的AI模型 四、应用场景与示例 五、未来展望 六、申请体验 加入GitHub Spark需要申请 GitHub Spark 是微软旗下GitHub在2024年10月30日的GitHub Universe大会上推出的一款革…

Qt中 QWidget 和 QMainWindow 区别

QWidget 用来构建简单窗口 QMainWindow 用来构建更复杂的窗口&#xff0c;QMainWindow 继承自QWidget&#xff0c;在QWidget 的基础上提供了菜单栏、工具栏、状态栏等功能 菜单栏&#xff08;QMenuBar&#xff09;工具栏&#xff08;QToolBar&#xff09;状态栏&#xff08;Q…

【MIT-OS6.S081笔记1】Chapter1阅读摘要:Operating system interfaces

记录阅读《xv6: a simple, Unix-like teaching operating system》的一些摘要&#xff0c;这是第一章的内容&#xff1a;Operating system interfaces。 fork函数作用&#xff1a;fork创建一个新进程&#xff0c;称为子进程&#xff0c;其内存内容与调用进程&#xff08;称为父…

学习python的第七天之数据类型——str字符串

学习python的第七天之数据类型——str字符串 Python 中的字符串&#xff08;String&#xff09;是最常用的数据类型之一&#xff0c;用于存储和表示文本信息。Python 中的字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能修改它&#xff08;但可以…

【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

文章目录 摘要一、引言二、主要方法1.3D Gaussian Splatting2.其他方法2.1 Gaussian Grouping&#xff08;ECCV 2024&#xff09;2.2 GARField 3. 2D Versatile 投影4. 3D Semantic Network4. 推理 四、实验1. 实验设置2.定量结果 论文&#xff1a;https://arxiv.org/pdf/2403.…

华为OD机试真题-仿LISP计算

题目描述&#xff1a; LISP 语言唯一的语法就是括号要配对。 形如(OP P1 P2 …)&#xff0c;括号内元素由单个空格分割。 其中第一个元素 OP 为操作符&#xff0c;后续元素均为其参数&#xff0c;参数个数取决于操作符类型。 注意: 参数 P1,P2 也有可能是另外一个嵌套的 (O…