Lote equivalente de “fuente” en Windows: cómo ejecutar un script Python desde un virtualenv

He hecho un poco de bash scripting, pero muy pocos scripts por lotes en Windows. Estoy tratando de activar un Python virtualenv, ejecutar un script de Python, luego desactivar el virtualenv cuando el script sale.

Tengo una carpeta llamada env , que es mi virtualenv, y una carpeta llamada trabajo, que contiene mis scripts.

Esto es lo que tengo hasta ahora:

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

Sin embargo, cuando ejecuto el script, activa el virtualenv y luego se detiene. No llega a la segunda línea y ejecuta el script de Python. ¿Hay alguna forma de “generar” la carpeta de script de activación, de modo que el rest del script por lotes pueda ejecutarse como si hubiera llamado a activate.bat desde la línea de comandos?

Yo diría que solo necesita anteponer ‘call’ a su invocación de enable.bat, para asegurarse de que el archivo por lotes actual se reanude después de que se ejecute el proceso de activación:

 call %~dp0env\Scripts\activate.bat 

Considera hacer lo mismo para deactivate.bat . Además, si desea asegurarse de que el entorno cmd.exe actual no esté contaminado por una llamada a su archivo por lotes, considere la posibilidad de envolver sus comandos en un par de comandos setlocal / endlocal .

Hice un archivo .lnk que apunta a cmd /k "path/to the/script/activate.bat" , y funciona.

Parámetros y opciones de CMD

Supongo que solo desea ejecutar los mismos comandos en Windows como se esperaba en Linux Bash / shell. Cuando quiero iniciar un virtualenv, en realidad estoy en su directorio superior, y el comando de Linux sería “fuente bin / activar”.

No es ningún problema simular este comportamiento en Windows. Personalmente, he puesto un archivo de proceso por lotes llamado enable.bat en algún lugar de la variable de entorno PATH como este:

 :: 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