跳转至

梳理了一套工程文件管理方法

壹丨背景

工作日常涉及许多算法和数据,如何高效的管理这些工程文件是一个很大的问题。

痛点 以前的做法 问题 解决思路
一些函数或方法会反复使用,如滤波、绘图等 Ctrl+CCtrl+V 建立一套算法库koko-learn,设计成通用函数
不同算法、数据的项目文件放在一起混乱 建立不同项目,链接同一个Conda环境 虚拟环境乱 改用rye做项目和虚拟环境管理
不同的rye项目都需要使用算法库 rye build打包,然后安装在不同项目 不同项目跑在koko-learn项目下
计算云需要使用算法库 同上,遇到算法库小问题不方便更新 git同步算法库,计算云强制同步

上述做法受到公司开发环境的限制,因此在外部不一定是最优解。如:

  1. 算法库无法打包上传,只能在本地传来传去
  2. Anaconda收费,虽然MiniForge可用,但已经厌倦了conda工具发生的各种库兼容问题
  3. 无法完全远程开发或本地开发。本地经常处理一些小批量数据,毕竟数据上传计算云需要不少时间开支;大型数据还必须依靠计算云

贰丨举例

假设:

  • 算法库命名:koko-learn

  • 工程文件命名:1017_KAN_1041017——日期,KAN——算法,104——数据集编号)

附:rye简单用法

用法 命令 用法 命令
新建项目 rye init xx 添加库 rye add xx
设置python版本 rye pin 3.11 删除库 rye remove xx
同步设置 rye sync 更新rye rye self update
更新库 rye sync --update-all

命令行激活虚拟环境

. .\.venv\Scripts\activate
. .venv/bin/activate

第一步,创建项目文件

mao@pekshcsitd33451:~$ rye init koko-learn
success: Initialized project in /home/mao/koko-learn
  Run `rye sync` to get started

自动生成的目录结构:

mao@pekshcsitd33451:~$ cd koko-learn/
mao@pekshcsitd33451:~/koko-learn$ tree
.
├── pyproject.toml
├── README.md
└── src
    └── koko_learn
        └── __init__.py

2 directories, 3 files

第二步,设置python版本

mao@pekshcsitd33451:~/koko-learn$ rye pin 3.11
pinned 3.11.9 in /home/mao/koko-learn/.python-version

第三步,初始化虚拟环境

mao@pekshcsitd33451:~/koko-learn$ rye sync
Initializing new virtualenv in /home/mao/koko-learn/.venv
Python version: [email protected]
Generating production lockfile: /home/mao/koko-learn/requirements.lock
Generating dev lockfile: /home/mao/koko-learn/requirements-dev.lock
Installing dependencies
   Built file:///home/mao/koko-learn                                                                                    Built 1 editable in 240ms
Installed 1 package in 0.42ms
 + koko-learn==0.1.0 (from file:///home/mao/koko-learn)
Done!

会创建虚拟环境目录.venv

命令行激活虚拟环境

. .\.venv\Scripts\activate
. .venv/bin/activate

第四步,创建算法库

算法库创建在src/koko_learn文件夹下,如:

from ._filtering import filter_signal

__all__ = [
    'filter_signal',
]
import numpy as np

def filter_signal(in_signal: list | np.ndarray,
                  cutoff: int | float | list | np.ndarray | tuple,
                  sample_rate: int | float,
                  order: int = 4,
                  filter_type: str = 'bandpass') -> np.ndarray:
    ...
from koko_learn.SignalProcessing import filter_signal

class Fetch104xx(DataBaseCls):
    def __init__(self,
                 path_base: str,
                 ) -> None:
    ...

第五步,创建工程

src/koko_learn的同级目录下创建工程,如:

from koko_learn.SignalProcessing import filter_signal

def main():
    ...
from koko_learn.GetModel import KAN

def main():
    ...

叁丨配置

1. .gitignore配置

# python generated files
__pycache__/
*/__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info
# jetbrains
.idea/
# venv
.venv/
# src
src/*
!src/PyPulse/

src/*——将src目录下所有路径屏蔽

!src/koko_learn/——排除koko_learn算法库文件夹(本地环境和计算云仅同步koko_learn算法库文件夹)

对于pyproject.toml,这里不建议屏蔽,为了远程可以快速初始化环境到与本地相同的虚拟环境

2. 计算云同步算法库

第一步,本地算法库同步到仓库

git add .
git commit -m 'xxxx'
git push

第二步,计算云重置到远程分支

git fetch origin
git reset --hard origin/<branch_name>

偷个小懒:

src/koko_learn/utils/sync_git.py
import os

if __name__ == '__main__':
    cmd = 'git fetch origin && git reset --hard origin/master'
    os.system(cmd)

这里使用了强制重置,所以当使用计算云跑程序发现算法库的Bug时,一定记得同时修改

3. 安装库

类型 举例 应对方法
算法库依赖,且使用频率高 tqdmnumpy 直接安装:rye add tqdm numpy
算法库依赖,但几乎不用 biosppy 创建check_module_support()方法检查并导入
算法库不依赖,工程依赖 ngboost 添加到开发依赖项:rye add ngboost --dev

检查包并导入

src/koko_learn/utils/_check_module_support.py
install_commands = {
 'torchvision': 'rye add torchvision',
 'torch': 'rye add torch',
 'biosppy': 'rye add biosppy',
 'wfdb': 'rye add wfdb',
}


def check_module_support(module_name, caller_name):
 try:
     module = __import__(module_name)
     return module
 except ImportError as e:
     raise ImportError(f"{caller_name} requires {module_name}.\n"
                       f"安装命令: {install_commands[module_name]}") from e

4. 远程软件

推荐JetBrains Gateway