У меня такая ситуация: я использую python с conda на машине с Windows и работаю в основном в cygwin, когда нахожусь в командной строке. Теперь conda позволяет использовать различные среды python, похожие на virtualenv, но он поставляется только со скриптом activation.bat для переключения сред. Обычно я делаю что-то вроде source activate env
, но это, очевидно, не работает с не-bash скриптом. Мой обходной путь выглядит так:
cmd /C "activate $1 & bash"
Что работает нормально, но немного неудовлетворительно, потому что это похоже на обходной путь. Есть ли способ импортировать переменные среды дочернего процесса в родительский процесс?
решение1
В cmd
переменные по умолчанию просачиваются в среду. Вам нужно окружить свои команды setlocal
-, endlocal
чтобы явно этого избежать. Поэтому вы можете использовать подход, предложенныйТомас Дикипоместить переменные среды в .bat
файл и call
сделать это в первую очередь.
Обычно мы делаем это на компьютерах с Windows, предоставляя setenv.bat
скрипт, который сначала запускаем в командной строке, прежде чем вызывать другие скрипты.
Редактировать: чтобы задать среду для родительского процесса, мы иногда делаем следующее. Просто создаем файл пар ключ-значение, описывающий среду:
envkey1=envval1
envkey2=envval2
и прочитать это в родительском процессе и соответствующим образом настроить среду.
Я не очень хорош в Python, но в Perl вы бы сделали что-то вроде
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);
решение2
Вероятно, нет. Ваше использование "&" в cmd
вызове - это самое близкое, что вы могли бы получить. Вы могли бы сделать его немного чище, используяcall
для скрипта "activate.bat".
Потому что call
не останавливает "родительскую" пакетную программу, которая находится ближе к "источнику" оболочки, который был запрошен. Я использую это в пакетных файлах, которые создают переменные окружения перед их последующим использованием в скрипте.
Однако неясно, о каком «родительском» процессе идет речь.
cmd /C "activate $1 & bash"
поскольку вы сообщаете, что вы распространяете переменные из activate.bat
в последующую bash
команду (если вы не имеете в виду родительскую команду cmd
).