1

Моя ситуация такова: я использую python с conda на машине с Windows и работаю в основном в cygwin, когда в командной строке. Теперь conda допускает различные среды Python, аналогичные virtualenv, но поставляется только со скриптом активации .bat для переключения сред. Обычно я делаю что-то вроде source activate env , но это, очевидно, не работает со сценарием не-bash. Мой обходной путь выглядит так:

cmd /C "activate $1 & bash"

Что хорошо работает, но немного неудовлетворительно, потому что это похоже на обходной путь. Есть ли способ импортировать переменные среды дочернего процесса в родительский процесс?

2 ответа2

0

Возможно нет. Ваше использование «&» в вызове cmd примерно настолько близко, насколько это возможно. Вы можете сделать его немного чище, используя call скрипта «activ.bat».

Поскольку call не останавливает "родительскую" пакетную программу, это ближе к "источнику" оболочки, который был запрошен. Я использую это в пакетных файлах, которые создают переменные среды, прежде чем использовать их позже в скрипте.

Однако неясно, на какой "родительский" процесс вы ссылаетесь в

cmd /C "activate $1 & bash"

так как вы сообщаете, что распространяете переменные из activate.bat в следующую команду bash (если вы не имеете в виду родителя cmd).

0

В cmd переменные по умолчанию передаются в среду. Вы должны окружить свои команды setlocal - endlocal чтобы явно избежать этого. Поэтому вы можете использовать подход, предложенный Томасом Дики, чтобы поместить переменные среды в файл .bat и сначала call .

Обычно мы делаем это на компьютерах с Windows, предоставляя сценарий setenv.bat который мы сначала запускаем в командной строке, а затем вызываем другие сценарии.

Редактировать: чтобы установить среду для родительского процесса, мы иногда делаем следующее. Просто создайте файл пар ключ-значение, описывающих среду:

envkey1=envval1
envkey2=envval2

и прочитайте это в родительском процессе и настройте среду таким образом.

Мой Python-fu не так хорош, но в 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);

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .