梳理了一套工程文件管理方法
壹丨背景¶
工作日常涉及许多算法和数据,如何高效的管理这些工程文件是一个很大的问题。
| 痛点 | 以前的做法 | 问题 | 解决思路 |
|---|---|---|---|
| 一些函数或方法会反复使用,如滤波、绘图等 | Ctrl+C,Ctrl+V | 累 | 建立一套算法库koko-learn,设计成通用函数 |
| 不同算法、数据的项目文件放在一起混乱 | 建立不同项目,链接同一个Conda环境 | 虚拟环境乱 | 改用rye做项目和虚拟环境管理 |
不同的rye项目都需要使用算法库 | rye build打包,然后安装在不同项目 | 累 | 不同项目跑在koko-learn项目下 |
| 计算云需要使用算法库 | 同上,遇到算法库小问题不方便更新 | 累 | git同步算法库,计算云强制同步 |
上述做法受到公司开发环境的限制,因此在外部不一定是最优解。如:
- 算法库无法打包上传,只能在本地传来传去
- Anaconda收费,虽然MiniForge可用,但已经厌倦了
conda工具发生的各种库兼容问题- 无法完全远程开发或本地开发。本地经常处理一些小批量数据,毕竟数据上传计算云需要不少时间开支;大型数据还必须依靠计算云
贰丨举例¶
假设:
算法库命名:
koko-learn工程文件命名:
1017_KAN_104(1017——日期,KAN——算法,104——数据集编号)附:
rye简单用法
用法 命令 用法 命令 新建项目 rye init xx添加库 rye add xx设置 python版本rye pin 3.11删除库 rye remove xx同步设置 rye sync更新 ryerye 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.pyimport os if __name__ == '__main__': cmd = 'git fetch origin && git reset --hard origin/master' os.system(cmd)这里使用了强制重置,所以当使用计算云跑程序发现算法库的Bug时,一定记得同时修改
3. 安装库¶
| 类型 | 举例 | 应对方法 |
|---|---|---|
| 算法库依赖,且使用频率高 | tqdm、numpy | 直接安装:rye add tqdm numpy |
| 算法库依赖,但几乎不用 | biosppy | 创建check_module_support()方法检查并导入 |
| 算法库不依赖,工程依赖 | ngboost | 添加到开发依赖项:rye add ngboost --dev |
检查包并导入:
src/koko_learn/utils/_check_module_support.pyinstall_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