目的
对于包含目录的每个子目录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
)
)