Skip to main content
 首页 » 编程设计

python之conda 自动更新 requirements.yml

2024年11月01日28Terrylee

我们正在使用 conda 来管理我们的 Python 项目的环境。让我们烦恼的一件事是团队中有人偶尔会在环境中安装一个新包,但忘记更新 requirements.yml 文件。

而不是在每次提交之前输入:

conda env export > requirements.yml 

是否可以在有人安装或删除软件包时自动更新该文件?

请您参考如下方法:

Git 钩子(Hook)

我不知道 conda(安装/升级/删除) 的 Hook 。但是,可以为 pre-commit 添加一个 Git Hook ,检查 environment.yaml 文件是否与 conda env export 的输出相匹配.有点像

.git/hooks/预提交

#!/bin/bash 
 
CONDA_ENV='my_env' 
ENV_FILE='environment.yaml' 
 
echo "Checking Conda environment '$CONDA_ENV' for changes..." 
 
CONDA_YAML=$(conda env export -n $CONDA_ENV) 
DIFF=$(echo "$CONDA_YAML" | git diff --no-index -- "$ENV_FILE" -) 
 
if [ "$DIFF" != "" ] 
then 
    echo "Changes were found in the Conda environment!" 
    echo "$DIFF" 
 
    echo "Updating $ENV_FILE." 
    echo "$CONDA_YAML" > "$ENV_FILE" 
 
    echo "Adding updated $ENV_FILE to commit." 
    git add "$ENV_FILE" 
else 
echo "No changes detected. Proceeding with commit." 
fi 
 
exit 0 

这可能是最残酷的做法(即,只是盲目地覆盖文件并将其放入提交中)。一个更温和的选择是向用户发出警告并按原样继续提交。然后他们可以选择是否需要使用他们的 env YAML 修改提交。

此脚本主要只是概念验证。您可能需要解决的问题是,除非您的团队只有一个 env 实例,否则 YAML 中的 prefix: ... 行将有所不同; channels: ... 如果用户有不同的 .condarc 设置,也可能会略有不同。我想您可以从 $CONDA_YAML 中过滤掉此类差异以跨用户规范化。否则,每次不同的用户提交时,它都会提交一个新版本。

不幸的是,you can't push hook files directly ,所以你需要说服你的团队以某种方式将这样的脚本放在他们本地的 .git/hooks/ 文件夹中。 This thread讨论了一些使其间接提交的技巧。