Пакетный эквивалент исходного кода в Windows: как запустить скрипт Python из virtualenv

Я сделал довольно много сценариев bash, но очень мало пакетных сценариев для Windows. Я пытаюсь активировать виртуальную среду Python, запустить скрипт Python, а затем деактивировать виртуальную среду при выходе из сценария.

У меня есть папка с именем env, которая является моей виртуальной средой, и папка с именем work, которая содержит мои скрипты.

Это то, что у меня есть до сих пор:

%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate

Однако, когда я запускаю скрипт, он активирует virtualenv, а затем останавливается. Он не доходит до второй строки и не запускает скрипт Python. Есть ли способ «использовать» папку сценария активации, чтобы остальную часть пакетного сценария можно было запустить, как если бы я вызвал activate.bat из командной строки?


person jmite    schedule 21.07.2011    source источник


Ответы (3)


Я бы сказал, что вам просто нужно добавить «вызов» к вызову активации.bat, чтобы гарантировать, что текущий пакетный файл возобновится после выполнения активации:

call %~dp0env\Scripts\activate.bat

Попробуйте сделать то же самое для deactivate.bat. Кроме того, если вы хотите убедиться, что текущая среда cmd.exe не загрязняется вызовом вашего пакетного файла, подумайте о заключении ваших команд в пару команд setlocal/endlocal.

person Nicola Musatti    schedule 21.07.2011
comment
Я попробую это, но это похоже на то, что я хочу. Спасибо! - person jmite; 22.07.2011
comment
@Nicola Если пакет1.bat содержит batch2.bat и echo 1, а пакет2.bat содержит echo 2, и я запускаю пакет1.bat, я вижу открытую новую оболочку, затем 2, затем 1, поэтому я не думаю, что это проблема. - person agf; 22.07.2011
comment
Из документации команды Call: Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу. (technet.microsoft.com/en-us/library /cc732835%28WS.10%29.aspx) - person Nicola Musatti; 22.07.2011
comment
@Nicola Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу. Это не то, что вам здесь нужно, верно? :) - person Piotr Dobrogost; 18.08.2011
comment
Это именно то, что мы хотим. Документы не очень ясны, они должны говорить прекращение, а не остановка. Они имеют в виду не какое-то параллельное выполнение; скорее, если вы не используете команду call, выполнение вызывающего пакета заменяется выполнением вызываемого, т. е. последующие инструкции в вызывающем пакете отбрасываются. С помощью команды call выполнение вызывающего пакета возобновляется после завершения вызываемого. - person Nicola Musatti; 18.08.2011
comment
@jmite, если это действительно решило вашу проблему, приятно «принять» это :) - person danodonovan; 04.03.2013
comment
Спасибо, это именно то, что я искал. - person Majid; 23.07.2013

Я создал файл .lnk, который указывает на cmd /k "path/to the/script/activate.bat", и он работает.

параметры и параметры CMD

person Maho    schedule 25.04.2012

Я полагаю, вы просто хотите выполнять те же команды в Windows, что и в Linux Bash/shell. Когда я хочу запустить virtualenv, я фактически нахожусь в его верхнем каталоге, и команда Linux будет «source bin/activate».

Это не проблема смоделировать это поведение в Windows. Лично я поместил пакетный файл с именем activate.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
person newby2000    schedule 27.07.2012