Mi situación es la siguiente: uso Python con conda en una máquina con Windows y trabajo principalmente en cygwin cuando estoy en la línea de comando. Ahora conda permite diferentes entornos de Python, similar a virtualenv, pero solo viene con un script de activación.bat para cambiar los entornos. Normalmente haría algo como source activate env
, pero obviamente eso no funciona con un script que no sea bash. Mi solución se ve así:
cmd /C "activate $1 & bash"
Lo cual funciona bien pero es un poco insatisfactorio porque parece una solución alternativa. ¿Existe alguna forma de importar las variables de entorno de un proceso hijo al proceso padre?
Respuesta1
En cmd
, las variables se filtran al entorno de forma predeterminada. Tienes que rodear tus comandos con setlocal
- endlocal
para evitar esto explícitamente. Por lo tanto, puede utilizar el enfoque sugerido porThomas Dickeyponer las variables de entorno en un .bat
archivo y call
eso primero.
Normalmente hacemos esto en máquinas con Windows, proporcionando un setenv.bat
script que ejecutamos primero en el símbolo del sistema antes de invocar otros scripts.
Editar: para establecer un entorno para un proceso principal, a veces hacemos lo siguiente. Simplemente tenga un archivo de pares clave-valor que describan el entorno:
envkey1=envval1
envkey2=envval2
y leer eso en el proceso principal y ajustar el entorno de esa manera.
Mi Python-fu no es tan bueno, pero en Perl harías algo como
open(my $f, '<', 'env.txt');
while (<$f>) {
chomp;
my ($k, $v) = split(m/=/, $_, 2); # assumes '=' as separator
$ENV{$k} = $v; # updates the current environment
}
close($f);
Respuesta2
Probablemente no. El uso de "&" en una cmd
llamada es lo más parecido que puedes conseguir. Es posible que puedas hacer que se vea un poco más limpio usandocall
para el script "activate.bat".
Porque call
no detiene el programa por lotes "principal", que está más cerca de la "fuente" del shell que se solicitó. Utilizo esto en archivos por lotes que crean variables de entorno antes de usarlas más adelante en el script.
Sin embargo, no está claro a qué proceso "principal" se refiere en
cmd /C "activate $1 & bash"
ya que informa que está propagando variables desde activate.bat
el bash
comando posterior (a menos que se refiera al padre de cmd
).