web-dev-qa-db-fra.com

Équivalent par lots de "source" sous Windows: comment exécuter un script Python à partir d'un virtualenv

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?

40
jmite

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.

59
Nicola Musatti

J'ai créé un fichier .lnk qui pointe vers cmd /k "path/to the/script/activate.bat", et il fonctionne.

paramètres et options CMD

6
Maho

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
2
newby2000