Minha situação é a seguinte: eu uso python com conda em uma máquina Windows e trabalho principalmente no cygwin quando estou na linha de comando. Agora o conda permite diferentes ambientes python, semelhantes ao virtualenv, mas só vem com um script activate.bat para alternar os ambientes. Normalmente eu faria algo parecido source activate env
, mas isso obviamente não funciona com um script que não seja bash. Minha solução alternativa é assim:
cmd /C "activate $1 & bash"
O que funciona bem, mas é um pouco insatisfatório porque parece uma solução alternativa. Existe uma maneira de importar as variáveis de ambiente de um processo filho para o processo pai?
Responder1
Em cmd
, as variáveis são vazadas para o ambiente por padrão. Você deve cercar seus comandos por setlocal
- endlocal
para evitar isso explicitamente. Portanto, você pode usar a abordagem sugerida porThomas Dickeypara colocar suas variáveis de ambiente em um .bat
arquivo e call
isso primeiro.
Geralmente fazemos isso em máquinas Windows, fornecendo um setenv.bat
script que executamos primeiro no prompt de comando antes de invocar outros scripts.
Editar: para definir um ambiente para um processo pai, às vezes fazemos o seguinte. Basta ter um arquivo de pares chave-valor descrevendo o ambiente:
envkey1=envval1
envkey2=envval2
e leia isso no processo pai e ajuste o ambiente dessa forma.
Meu Python-fu não é tão bom, mas em Perl você faria 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);
Responder2
Provavelmente não. O uso de "&" em uma cmd
chamada é o mais próximo possível. Você pode conseguir fazer com que pareça um pouco mais limpo usandocall
para o script "activate.bat".
Porque call
não para o programa em lote "pai", que está mais próximo da "fonte" do shell que foi solicitada. Eu uso isso em arquivos em lote que criam variáveis de ambiente antes de usá-las posteriormente no script.
No entanto, não está claro a qual processo "pai" você está se referindo
cmd /C "activate $1 & bash"
já que você relata que está propagando variáveis para activate.bat
o comando subsequente bash
(a menos que você se refira ao pai de cmd
).