【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…

Redis 典型应用 - 缓存(cache)

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

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

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

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

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

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

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

React教程(详细版)

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

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

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

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

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

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

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

加入GitHub Spark需要申请

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

Qt中 QWidget 和 QMainWindow 区别

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

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

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

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉哦“ (**)

Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 思考 1. 记忆公式&#xff1a; 按键操作的 7 字真言 1&#xff1a; "鱼爱返 说 温泉哦" v i Esc : wq ! ----------- 一般的简单…

Web服务nginx基本实验

安装软件&#xff1a; 启动服务&#xff1a; 查看Nginx服务器的网络连接信息&#xff0c;监听的端口&#xff1a; 查看默认目录&#xff1a; 用Windows访问服务端192.168.234.111的nginx服务&#xff1a;&#xff08;防火墙没有放行nginx服务&#xff0c;访问不了&#xff09; …

Ubuntu实现双击图标运行自己的应用软件

我们知道在Ubuntu上编写程序&#xff0c;最后编译得到的是一个可执行文件&#xff0c;大致如下 然后要运行的时候在终端里输入./hello即可 但是这样的话感觉很丑很不方便&#xff0c;下边描述一种可以类似Windows上那种双击运行的实现方式。 我们知道Ubuntu是有一些自带的程序…

x-cmd pkg | onefetch - 轻松获取 Git 仓库统计信息,打造个性化输出!

目录 简介首次用户功能特点常见用法类似或相关的工具进一步阅读 简介 onefetch 是由 Ossama Hjaji 用 Rust 编写的命令行 Git 信息工具&#xff0c;可将本地 Git 存储库的项目信息和代码统计信息直接显示到您的终端。该工具完全离线 - 不需要网络访问。 首次用户 本文的 dem…

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

一、何为Wasm &#xff1f; Wasm&#xff0c;全称 WebAssembly&#xff0c;官网描述是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm被设计为一个可移植的目标&#xff0c;用于编译C/C/Rust等高级语言&#xff0c;支持在Web上部署客户端和服务器应用程序。 Wasm 的开发者参…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数&#xff08;1&#xff09;WAL保留空间&#xff08;2&#xff09;监听地址 4. 启动主服务器5.…