J'ai fait pas mal de scripts bash, mais très peu de scripts batch sur Windows. J'essaie d'activer un Python virtualenv, exécutez un script Python, puis désactivez le virtualenv à la fin du script).
J'ai un dossier appelé env
, qui est mon virtualenv, et un dossier appelé work, qui contient mes scripts.
Voici ce que j'ai jusqu'à présent:
%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate
Cependant, lorsque j'exécute le script, il active le virtualenv puis s'arrête. Il ne parvient pas à la deuxième ligne et exécute le script Python. Existe-t-il un moyen de "source" le dossier de script d'activation, de sorte que le reste du script batch puisse être exécuté comme si je avait appelé activate.bat
depuis la ligne de commande?
Je dirais que vous avez juste besoin d'ajouter le préfixe 'call' à votre appel activate.bat, pour vous assurer que le fichier de commandes en cours est repris après l'activation:
call %~dp0env\Scripts\activate.bat
Pensez à faire de même pour deactivate.bat
. En outre, si vous souhaitez vous assurer que l'environnement cmd.exe actuel n'est pas pollué par un appel à votre fichier de commandes, pensez à encapsuler vos commandes dans une paire de commandes setlocal
/endlocal
.
J'ai créé un fichier .lnk qui pointe vers cmd /k "path/to the/script/activate.bat"
, et il fonctionne.
Je suppose que vous voulez simplement exécuter les mêmes commandes sous Windows que si elles étaient attendues sous Linux Bash/Shell. Lorsque je veux démarrer un virtualenv, je suis en fait dans son répertoire supérieur, et la commande Linux serait "source bin/activate".
Ce n'est pas un problème de simuler ce comportement sous Windows. Personnellement, j'ai mis un fichier batch nommé activate.bat
quelque part sur la variable d'environnement PATH comme ceci:
:: 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