#python #batch-file #variables #cmd #conda
Вопрос:
Я хочу сохранить вывод команды «conda активировать env_name» в переменную в пакетном файле, чтобы определить, нужно ли мне создавать новую среду для сценария на моем устройстве.
Я попытался выполнить следующий код, в котором я сохраняю переменную как вывод и возвращаю ее обратно:
for /f %%i in ('call conda activate env_name') do set output=%%i
echo %output%
Однако это возвращает:
%output%
Я пробовал это с различными другими формами вывода, включая %вывода и %%вывода. Я считаю, что переменная вообще не задается, потому что, когда я использую set output=i, вместо этого она повторяет i.
Точно так же мне немного повезло с сохранением выходных данных в файл вместо этого.
'conda activate env_name' 2>> "temp.txt"
set /p OUTPUT=<"temp.txt"
echo %OUTPUT%
Где на этот раз текстовый файл и повторяющий вывод переменной возвращает следующее:
''conda' is not recognized as an internal or external command,
Однако это не тот результат, который я ищу. Обычно, когда я вручную запускаю команду, я вижу сообщение ниже, и это результат, который я надеюсь сохранить в переменной:
Could not find conda environment: env_name
You can list all discoverable environments with `conda info --envs`.
Комментарии:
1. команда есть
conda
, но нет'conda
. Одинарные кавычки используются только вfor /f
команде. Вы пробовалиfor /f %%i in ('call conda activate env_name 2^>^amp;1') do set output=%%i
?2. @Stephan Это намного ближе, похоже, что теперь он сохраняет вывод как первое слово в последней строке!
3. Да, последняя строчка.
for /f
обрабатывает каждую непустую строку, поэтому она снова и снова перезаписывает переменную и оставляет вас с последней строкой. Используйтеdelims=
, чтобы получить всю строку (см.for /?
, Чтобы узнать больше).2>amp;1
перенаправляет STDERR в то же место назначения, что и STDOUT, что также позволяетfor /f
перехватить его.4. Может быть, вам даже не нужно
for
:call conda activate env_name 2>amp;1 |find "Could not find conda environment" amp;amp; echo no such env
— конечно, это зависит от ваших намерений.