使用 shell 的目录名和目录中所有子目录的 cd

使用 shell 的目录名和目录中所有子目录的 cd

目的

对于包含目录的每个子目录setup.py,运行pip uninstall -y <directory name>pip install .

Windows 解决方案

> for /D %f in (.\*) do (cd "%cd%\%f" && set s=%f && set j=%s:~3% && pip uninstall %j% && pip install .)

编辑:看起来 pip uninstall/reinstall 可以通过以下方式完成:

(for %F in ("%cd%") do pip uninstall -y "%~nxF") & pip install .

Linux 解决方案

#!/usr/bin/env bash

DIR="${DIR:-$PWD}
VENV="${VENV:-.venv}"
REQUIREMENTS="${REQUIREMENTS:-'requirements.txt'}";

if [ ! -d "$VENV/bin" ]; then
    echo Cannot find "$VENV/bin"
    exit 2;
fi

source "$VENV/bin/activate"

for f in "${DIR[@]}"; do
    if [ -f "$f/setup.py" ]; then
        builtin cd "$f";
        pip uninstall -y "${PWD##*/}";
        if [ -f "$REQUIREMENTS" ]; then
            pip install -r "$REQUIREMENTS"
        fi
        pip install .;
        builtin cd ..;
    fi;
done

如您所见,我的 Linux 解决方案更加通用。实际上我的 Windows 解决方案不起作用。

Windows 解决方案正在压缩字符串,因此运行之间的事情不确定。似乎正在进行一些奇怪的参数扩展。我该如何在 CMD 中执行此操作?

答案1

这看起来似乎是在将一个写得不好的批处理单行程序和一个功能齐全的 bash 脚本进行不公平的比较(我同意 cmd.exe 的限制要多得多)。
为什么在卸载时要从文件夹名称中删除前 3 个字符?

这批可能有效:

@Echo off
for /D %%f in (*) do (
  If exist "%f\setup.py" (
    PushD "%%f"
    pip uninstall "%%f"
    pip install .
    PopD
  )
)

相关内容