Мне нужно запустить цикл while
для установки зависимостей Python.В последнее время в мире Python существует 2 способа установки зависимостей, которые установились:
- с использованием
conda
(для некоторых людей это «надежный / стабильный / желаемый способ», предоставляемый «Дистрибутив Python "называется Anaconda / Miniconda), - с использованием
pip
(в последние несколько лет включен в качестве официального способа самого Python).
" Псевдокод "должен быть:
- попробуйте установить зависимость с помощью команды
conda
- , если она не удалась, установите ее с помощью команды
pip
ВМировые зависимости Python указываются в файле requirements.txt
, обычно точные версии (==
) в виде одной зависимости на строку с шаблоном <MY_DEPENDENCY>==<MY_VERSION>
.
Эквивалентная bash
желаемая команда: while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
однако это не работает в мире GNU make
/ Makefile
по причинам, которые я до конца не понимаю.
Я пробовал несколько разных вариантов этого цикла while
- все безуспешно,Обычно после сбоя команды conda
я не могу продолжить попытку pip
.Я не уверен, почему это происходит (так как это работает в «обычном bash
»), и я не могу найти способ управления каким-либо низкоуровневым шаблоном try / catch (для тех, кто знаком с языками программирования высокого уровня).
Это моя последняя попытка, которая не работает, потому что она останавливается при сбое conda
:
foo-target:
# equivalent to bash: conda install --yes $requirement || pip install $requirement;
while read requirement; do \
conda install --yes $requirement ; \
[ $$? != 0 ] || pip install $requirement; \
done < requirements.txt
Как мне убедиться, что я пытаюсь установить каждое требование внутри requirements.txt
сначала с conda
, когда conda
терпит неудачу, затем с pip
?
Почему мой код не работает?Я вижу людей, указывающих на различия между sh
и bash
, но я не могу выделить проблему.
Редактировать:
Я закончил работатьиспользование команды bash
внутри Makefile
, но Я считаю это решение не идеальным , потому что мне нужно сохранить еще один кусок кода в однострочном скрипте bash (см. ниже),есть способ хранить все вещи внутри Makefile
, избегая bash
вообще ?
Цель Makefile
:
foo-target:
bash install-python-dependencies.sh
bash
однострочный скрипт:
#!/usr/bin/env bash
while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
Я могу запустить скрипт прямо из командной строки (bash
), я также могу запустить его из Makefile
, но Я бы хотелизбавьтесь от скрипта bash и всегда выполняйте make foo-target
без использования bash
(избегая bash
даже внутри Makefile
).