Цель

Для каждого подкаталога в каталоге, содержащем 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 может быть сделано с:

(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 ответ1

0

Это похоже на несправедливое сравнение плохо написанного пакета с одним вкладышем и полноценного bash-скрипта (я согласен, что cmd.exe гораздо более ограничен).
Почему вы удаляете первые 3 символа из имени папки при удалении?

Эта партия может работать:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .