Meine Situation ist folgende: Ich verwende Python mit Conda auf einem Windows-Rechner und arbeite hauptsächlich in Cygwin, wenn ich auf der Kommandozeile bin. Conda ermöglicht verschiedene Python-Umgebungen, ähnlich wie virtualenv, wird aber nur mit einem activation.bat-Skript zum Umschalten der Umgebungen ausgeliefert. Normalerweise würde ich so etwas machen wie source activate env
, aber das funktioniert offensichtlich nicht mit einem Nicht-Bash-Skript. Meine Problemumgehung sieht folgendermaßen aus:
cmd /C "activate $1 & bash"
Das funktioniert gut, ist aber ein wenig unbefriedigend, weil es sich wie eine Problemumgehung anfühlt. Gibt es eine Möglichkeit, die Umgebungsvariablen eines untergeordneten Prozesses in den übergeordneten Prozess zu importieren?
Antwort1
In cmd
werden Variablen standardmäßig an die Umgebung weitergegeben. Sie müssen Ihre Befehle mit setlocal
- umgeben endlocal
, um dies explizit zu vermeiden. Daher können Sie den von vorgeschlagenen Ansatz verwendenThomas Dickeyum Ihre Umgebungsvariablen in eine .bat
Datei zu packen und call
zwar zuerst.
Normalerweise tun wir dies auf Windows-Rechnern, indem wir ein setenv.bat
Skript bereitstellen, das wir zuerst in der Eingabeaufforderung ausführen, bevor wir andere Skripte aufrufen.
Bearbeiten: Um eine Umgebung für einen übergeordneten Prozess festzulegen, gehen wir manchmal wie folgt vor. Sie benötigen lediglich eine Datei mit Schlüssel-Wert-Paaren, die die Umgebung beschreiben:
envkey1=envval1
envkey2=envval2
und lesen Sie das im übergeordneten Prozess und passen Sie die Umgebung entsprechend an.
Mein Python-Fu ist nicht so toll, aber in Perl würde man so etwas machen wie
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);
Antwort2
Wahrscheinlich nicht. Ihre Verwendung von "&" in einem cmd
Aufruf ist so nah dran, wie Sie nur kommen können. Sie können es vielleicht ein wenig sauberer aussehen lassen, indem Siecall
für das Skript „activate.bat“.
Weil dadurch call
das „übergeordnete“ Batchprogramm nicht gestoppt wird, das sich näher an der angeforderten Shell-„Quelle“ befindet. Ich verwende dies in Batchdateien, die Umgebungsvariablen aufbauen, bevor sie später im Skript verwendet werden.
Es ist jedoch unklar, auf welchen „übergeordneten“ Prozess Sie sich beziehen in
cmd /C "activate $1 & bash"
activate.bat
da Sie melden, dass Sie Variablen von in den nachfolgenden Befehl weitergeben bash
(es sei denn, Sie meinen das übergeordnete Element von cmd
).