Пакет Windows: проблема с запуском команды после предложения IF-ELSE - PullRequest
0 голосов
/ 09 октября 2018

Я обнаружил очень странную проблему со сценарием .bat в Win10:

@ECHO OFF
IF NOT EXIST ".\venv\" (
    ECHO | SET /p msg="Creating virtual environment..."
    python -m venv venv
    ECHO OK
    venv\Scripts\activate.bat
    python -m pip install --upgrade pip setuptools
    pip install -r requirements.txt
) ELSE (
    venv\Scripts\activate.bat
)
python runner.py

Последняя команда python runner.py никогда не выполняется.Однако, если я продублирую команду в предложениях IF и ELSE, она будет выполнена нормально.Что может быть причиной для этого?

PS Я пытался использовать IF-GOTO и GOTO в предложении IF-ELSE - ничего.Похоже, сценарий заканчивается закрывающей скобкой и все.И похоже, что проблема в venv\Scripts\activate.bat.Как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Элемент управления не возвращается к родительским сценариям по умолчанию, поэтому при запуске второго сценария изнутри пакетного файла родительский сценарий фактически завершается.

Второй сценарий можно запустить в дочернем элементе.обработать с помощью команды call.Таким образом, после завершения второго сценария поток возвращается к родительскому сценарию.

@ECHO OFF
IF NOT EXIST ".\venv\" (
    ECHO | SET /p msg="Creating virtual environment..."
    python -m venv venv
    ECHO OK
    call venv\Scripts\activate.bat
    python -m pip install --upgrade pip setuptools
    pip install -r requirements.txt
) ELSE (
    venv\Scripts\activate.bat
)
python runner.py
0 голосов
/ 09 октября 2018

Причина заключается в том, что эти строки имеются в частях "then" и "else":

venv\Scripts\activate.bat

Эта строка означает выполнение другого пакетного файла .Если вы хотите, чтобы после выполнения другого пакетного файла поток управления вернулся к строке ниже, то вы должны выполнить его как «подпрограмму» с помощью команды call:

call venv\Scripts\activate.bat

В противном случае, когдадругой пакетный файл заканчивается (activate.bat), процесс заканчивается в этой точке.

0 голосов
/ 09 октября 2018

Вероятно, это связано с магией, которую делает скрипт активации virtualenv, например, создание новой оболочки, чтобы ваш основной скрипт не продолжался.

Не уверен, что это будет работать, но в аналогичном скрипте, который я мог бы сделать,это работает, выполняя следующие команды, связанные с &, вы можете попробовать что-то вроде этого:

@ECHO OFF
IF NOT EXIST ".\venv\" (
    ECHO | SET /p msg="Creating virtual environment..."
    python -m venv venv
    ECHO OK
    venv\Scripts\activate.bat & (python -m pip install --upgrade pip setuptools && pip install -r requirements.txt && python runner.py)
) ELSE (
    venv\Scripts\activate.bat & python runner.py
)
...