2011-07-21 15 views
36

Tak, zrobiłem sporo skryptów bash, ale bardzo mało skryptów wsadowych w systemie Windows. Próbuję aktywować pythona virtualenv, uruchomić skrypt Pythona, a następnie dezaktywować virtualenv po wyjściu skryptu.wsadowy odpowiednik "źródła" w Windows: jak uruchomić skrypt Pythona z virtualenv

mam folder o nazwie ENV, który jest moim virtualenv i folder o nazwie praca, która zawiera moje skrypty

To jest to, co mam do tej pory:

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

jednak , kiedy uruchomię skrypt, aktywuje on virtualenv, a następnie zatrzymuje się. Nie przechodzi do drugiej linii i uruchamia skrypt Python. Czy istnieje sposób "źródła" folderu skryptu aktywacji, aby można było uruchomić resztę skryptu wsadowego tak, jakbym wywołał plik activ.bat z wiersza poleceń?

Odpowiedz

55

powiedziałbym wystarczy poprzedzić „zadzwonić” do activate.bat wezwaniem, aby upewnić się, że obecny plik wsadowy zostanie wznowione po Aktywacja jest wykonywana:

call %~dp0env\Scripts\activate.bat 

rozważyć robi to samo dla włączania i wyłączania .nietoperz . Ponadto, jeśli chcesz się upewnić, że bieżące środowisko cmd.exe nie jest zanieczyszczone wywołaniem pliku wsadowego, pomyśl o zawijaniu poleceń w parze poleceń setlocal/endlocal.

+0

Wypróbuję to, ale wydaje mi się, że dokładnie to, czego chcę. Dzięki! – jmite

+0

@Nicola Jeśli batch1.bat zawiera 'batch2.bat' i' echo 1', a batch2.bat zawiera 'echo 2', i uruchomię batch1.bat, widzę nową powłokę otwartą, następnie' 2', następnie ' 1', więc nie sądzę, że to jest problem. – agf

+0

Z dokumentacji polecenia "Zadzwoń": "Wywołuje jeden program wsadowy z drugiego bez zatrzymywania programu wsadowego nadrzędnego." (http://technet.microsoft.com/en-us/library/cc732835%28WS.10%29.aspx) –

2

Przypuszczam prostu chcesz perfrom tych samych komend w oknach, jakby oczekiwano w linux bash/powłoki. Kiedy chcę uruchomić virtualenv Jestem w swoim głównym katalogu, polecenie linux będzie "bin źródłowy/aktywuj". Symulowanie tego zachowania w oknach nie stanowi problemu. Osobiście umieściłem nazwę pliku wsadowego activate.bat gdzieś na 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 
Powiązane problemy