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

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

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

  • 优秀的程序员都使用规范的项目代码结构,了解这些好的习惯方式,有助于快速读懂代码
  • 如果项目是几个人合作开发,好的代码结构,便于分工,减少混乱,使项目开发过程更顺畅。
  • 采用规范的项目结构,也便于项目打包、编译、在社区共享。

本文将为您介绍: 项目结构预备知识,基本项目结构 ,带多个子包的项目结构,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 文件,或者 pyproject.toml, 这是要项目打包配置文件
  • 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

4. 包含子应用的项目结构

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

5. 适用于 setuptools 构建工具的项目结构

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"]

包含测试文件夹的项目结构
采用 setuptool 构建的项目,如果不打包测试文件,就将测试文件夹移到 src/ 之 外,通常项目根目录下添加 tests/ 子目录,如下

project_root_directory
├── pyproject.toml  # 项目配置文件,或者使用 setup.cfg, setup.py
├── ...             # 如 readme.rst, license等
├── src/
├── pytest.ini      # pytest配置文件
└── tests/          # 保存项目测试文件
         |----   __init__.py 
         |----   test_mypkg_module1.py 
         |----   test_xxx.py 
  ...

为了在测试文件中可以搜索到各个package,应将 src/ 绝对路径添加到环境变量 PYTHONPATH中。

set PYTHONPATH=D:\roject_root_path\src
# linux 下:export PYTHONPATH='/project_root_path/src

6. Flask 项目结构

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

7. 机器学习项目结构

机器学习项目是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

8. FastAPI 项目结构

FastAPI 框架采用异步框架,与Flask项目结构还是有区别的,主要通常会将 dependencies 与Data Model 代码分别放在两个子目录中保存。


my_fastapi_app/
│
├── src/
│   ├── __init__.py
│   ├── main.py
│   ├── routes/
│   │   ├── __init__.py
│   │   ├── users
│   │   ├── router-1.py
│   │   ├── router-2.py
│   │ 
│   ├── core/
│   │   ├── __init__.py
│   │   ├── config.py
│   │   ├── security.py
│   │   ├── database.py
│   │
│   ├── dependencies/
│   │   ├── __init__.py
│   │   ├── authentication.py
│   │
│   ├── models/
│   │   ├── __init__.py
│   │   ├── example.py
│   │   ├── another_example.py
│   │
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_example.py
│   │   ├── test_another_example.py
│   │
│   ├── utils/
│   │   ├── __init__.py
│   │   ├── helpers.py
│   │
├── .env
├── Dockerfile
├── requirements.txt
├── docker-compose.yml

说明

  • src/routers : 各个API 按功能分为不同的文件,也可以分成子包。
  • src/dependencies: 用于保存FastAPI路径函数的依赖, 这是FastAPI术语,注意不是python的第3方库。
  • src/core: 用于保存DataBase API, 项目配置文件等。
  • src/Models: FastAPI定义的Data Model 放在此文件夹。

总结

本文描述的python最流行的基本项目结构形式,后续继续给大家介绍,多应用项目,web项目,AI类应用项目结构的建议。

关于项目打包与部署相关知识, 可参考本博主其它文章:
Python项目打包与部署(三):打包与部署的实际操作流程

12-25
WinHex是一个专门用来对付各种日常紧急情况的小工具。它可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据。总体来说是一款非常不错的 16 进制编辑器。得到 ZDNetSoftwareLibrary 五星级最高评价,拥有强大的系统效用。 13.2 SR-11 更新内容: * 在目录浏览器列头添加新的快速过滤按钮,可以动态修改过滤设置。 * 修改索引算法,索引文件现在相当小。以前的索引文件将不能在这个版本中使用。 * 报告表格式修改为 tab 分隔文本文件,可以动态过滤或牵引。 * 注释现在使用 Unicode 字符集。 * 容器标题、文件名、描述、图象文件名、证据对象标题、注释、命令行参数全部使用 Unicode 字符。 * 现在可以在容器根目录选择证据对象查看。 * v13.2 保存的安全将不能用以前版本的 X-Ways Forensics 打开,它不能从以前版本的案例中导入某些项目。 * 书签列表同证据对象关联。 * 证据对象的名称在目录浏览器中单独的列中显示。这个字段在递归资源管理容器根和报告表中以及导入中起到很重要的作用。 * 丢失分区可以通过 X-Ways Forensics 找回。 * 重新创建 FAT 卷快照可以识别文件被重命名或移动。 * 支持 UDF 光盘格式中的多重会话。 * 精确的驱动器盘符写入保护(默认启用)。 * 自动保护容器选项。 * 目录浏览器选项现在允许锁定左边的列。 * 在目录浏览器上下文菜单中禁用排序的能力。 * 所有信息容器的文本可以记录到 messages.txt。 * 重新创建的证据文件容器优化后在添加大量文件时有较好的性能。 * 你可以立即查看 Windows 事件日志 (.evt) 文件。(仅 forensic 授权) * File Type Signatures.txt 支持更多的文件类型。 * 在创建映象文件时,Forensics 显示平均数据传输量(MB/分)和平均压缩比例。 * 容器报告现在更灵活。所有组件都可以选择。 * 当验证证据对象的 hash 或计算时,结果将被添加到证据对象的技术描述中。 * 标准的模板文件扩展名修改为 .tpl。 * 一些局部修复和改进。 单文件版本哦!~
<think>好的,用户想了解或使用WinHex工具,询问它的使用方法和下载方式。首先,我需要确认用户的需求是什么。WinHex是一个十六进制编辑器和磁盘编辑器,常用于数据恢复、计算机取证等场景。用户可能需要进行磁盘分析、文件恢复,或者处理低级数据操作。 接下来,我需要检查提供的引用内容。根据引用[1],用户已经提到了使用WinHex工具,并且有下载链接。不过,引用中的链接显示的是WinHex的官方网站,可能需要确认链接是否有效。同时,引用[2]到[4]的内容似乎和WinHex无关,但用户可能在其他上下文中提到过这些,所以需要专注在引用[1]的信息上。 用户的问题分为两部分:使用方法和下载。关于使用方法,我需要简要介绍WinHex的主要功能,比如十六进制编辑、磁盘克隆、数据恢复等,并给出基本步骤。例如,打开文件或磁盘、进行编辑或分析、保存更改。同时,提醒用户谨慎操作,避免数据丢失。 关于下载,引用[1]中提到了下载地址,但实际检查提供的引用链接是否正确。根据引用[1],正确的下载链接应该是WinHex的官方网站。我需要确保提供的链接准确,并且指导用户如何从官网下载,避免第方下载带来的风险。 另外,需要注意用户可能对计算机取证或数据恢复不熟悉,所以解释时要简明易懂。同时,强调软件的合法使用,遵守相关法律法规。可能还需要提到系统兼容性,比如支持哪些Windows版本,是否有64位版本等。 最后,考虑到用户可能需要进一步帮助,生成相关问题,如系统兼容性、替代软件、数据恢复步骤等,这样用户可以根据自己的需求继续探索。</think>### WinHex工具使用与下载指南 #### 一、WinHex简介 WinHex是由X-Ways公司开发的十六进制编辑器及磁盘编辑工具,支持文件恢复、磁盘克隆、内存编辑等功能,适用于数据恢复、计算机取证等领域[^1]。 #### 二、下载方法 1. **官网下载** 访问[WinHex官方网站](https://www.winhex.com/winhex/),选择对应系统版本(Windows/Linux) *注意:需购买许可证,试用版功能有限* 2. **功能模块** - 十六进制文件编辑 - 磁盘扇区级访问 - RAID重组与内存分析 - 数据擦除与哈希校验 #### 、基础使用步骤(以文件恢复为例) ```python # 伪代码示例:文件头特征扫描 def file_recovery(disk_image): file_signatures = { "JPEG": b"\xFF\xD8\xFF", "PDF": b"\x25\x50\x44\x46" } scan_clusters(disk_image, file_signatures) ``` 1. 启动WinHex后选择"Open Disk"加载存储设备 2. 使用"Search → Find Hex Values"定位文件特征码 3. 通过"Recovery → Recover File"尝试恢复数据 4. 导出恢复文件前验证哈希值 #### 四、注意事项 - 操作前建议创建磁盘镜像(`Tools → Clone Disk`) - 修改原始存储介质可能导致数据不可逆损坏 - 支持NTFS/EXT4等20+文件系统解析
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值