Пакетный эквивалент "источника" в Windows: как запустить скрипт Python из virtualenv
Итак, я выполнил довольно много сценариев bash, но очень мало пакетных сценариев в Windows. Я пытаюсь активировать python virtualenv, запустить скрипт python, а затем деактивировать virtualenv при выходе из скрипта.
У меня есть папка с именем env, которая является моим virtualenv, и папка с именем work, которая содержит мои сценарии
Вот что у меня так далеко:
%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate
Однако когда я запускаю скрипт, он активирует virtualenv, а затем останавливается. Он не попадает на вторую строку и запускает скрипт Python. Есть ли какой-нибудь способ "найти" папку сценария активации, чтобы остальная часть пакетного сценария могла быть запущена так, как если бы я вызывал activ.bat из командной строки?
3 ответа
Я бы сказал, что вам просто нужно добавить 'call' к вашему вызову activ.bat, чтобы убедиться, что текущий пакетный файл возобновляется после выполнения активации:
call %~dp0env\Scripts\activate.bat
Попробуйте сделать то же самое для deactivate.bat. Кроме того, если вы хотите убедиться, что текущая среда cmd.exe не загрязнена вызовом вашего пакетного файла, рассмотрите возможность обернуть ваши команды в setlocal
/endlocal
пара команд.
Я сделал файл.lnk, который указывает на cmd /k "path/to the/script/activate.bat"
и это работает.
Я полагаю, просто хочу выполнить те же команды в Windows, как и в Linux Bash / Shell. Когда я хочу запустить virtualenv, я нахожусь в самом верхнем каталоге, команда linux будет "source bin / activ". Это не проблема для имитации этого поведения в Windows. Лично я поместил имя командного файла activ.bat где-нибудь в PATH так:
:: activate.bat
@echo off
REM source bin/activate
if "%1" == "bin/activate" (
if not EXIST "%CD%\Scripts\activate.bat" goto notfound
set WRAPEX=Scripts\activate.bat
) ELSE (
set WRAPEX=%*
)
call %WRAPEX%
goto :eof
:notfound
echo Cannot find the activate script -- aborting.
goto :eof