Без ошибок устанавливать только доступные пакеты с помощью conda install --yes --file requirements.txt

96

При установке пакетов в файле requirements.txt с помощью Conda с помощью следующей команды

conda install --yes --file requirements.txt

Если пакет в файле requirements.txt недоступен, возникает ошибка «Нет пакета», как показано ниже:

Использование сайта api Anaconda Cloud https://api.anaconda.org

Получение метаданных пакета: ....

Ошибка: пакеты не найдены в текущих совпадающих каналах linux-64: nimfa == 1.2.3

Вы можете найти этот пакет на anaconda.org с помощью

anaconda search -t conda nimfa ==1.2.3

Можно ли изменить это поведение вместо того, чтобы выдавать ошибку, чтобы он устанавливал все доступные пакеты в файле requirements.txt и выдавал предупреждение для тех, которые недоступны?

Я бы хотел этого, потому что пакет nimfa, о котором говорится в сообщении об ошибке, недоступен, можно установить с помощью пипса. Поэтому, если я могу изменить поведение, conda install --yes --file requirements.txtчтобы просто выдавать предупреждение о недоступных пакетах, я могу отслеживать это с помощью команды pip install -r requirments.txtв .travis.yml, чтобы TravisCI попытался установить его из любого места, где он доступен.

cdeepakroy
источник

Ответы:

170

В итоге я просто перебирал строки файла

$ while read requirement; do conda install --yes $requirement; done < requirements.txt

Изменить : если вы хотите установить пакет с помощью pip, если он недоступен через conda, попробуйте:

$ while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt

Изменить : если вы используете Windows (кредит принадлежит @Clay ):

$ FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f"

Тилль Хоффманн
источник
5
Спасибо за это, небольшая подсказка для всех, кто его использует, убедитесь, что ваш файл requirements.txt заканчивается новой строкой, чтобы последний пакет был прочитан
Мараван Окаша
1
Есть ли способ также автоматически использовать pip installпакеты, которые недоступны conda install, во время итерации?
PeterB
2
@delusionX, я расширил ответ.
Тилль Хоффманн,
11
Решение @TillHoffmann на машине с Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" работает очень хорошо. Благодарность!
Clay
3
Если у вас есть комментарии в файле требований, pip подробно жалуется (раздражает, если безвредно). Вариант однострочника bash, который игнорирует комментарии:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Для тех, кто ищет, я использовал это как решение @TillHoffmann для раковины рыбы:

$ while read requirement; conda install --yes $requirement; end < requirements.txt

А также

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
Юрий-М-Диас
источник
1

Ответ Pbms здесь - правильный способ сделать это, если у вас есть существующая среда, которую нужно скопировать. Conda полностью способна устанавливать как пакеты Conda, так и пакеты pip, как указано в environment.yml. Я хотел более подробно задокументировать весь процесс. Обратите внимание, что я использую среду на основе папок, поэтому я добавил --prefix [path to environment folder]в большинство команд.

Допустим, вы установили среду для существующего проекта в папку с именем envв текущей папке, например:

conda create --prefix ./env

Вы бы создали environment.ymlдля этого проекта такую ​​среду:

conda env export --prefix ./env > environment.yml

Вы создадите новую среду в какой-то другой папке, скопировав environment.ymlтуда, а затем запустив это оттуда:

conda env create --prefix ./env --file environment.yml

Вы получите уже существующую среду для соответствия environment.yml, еще раз скопировав environment.ymlтуда, а затем запустив это оттуда:

conda env update --prefix ./env --file environment.yml --prune

Когда рассматриваемая среда активна, вы должны проверить состояние ее пакетов следующим образом:

conda list

Это сокращенная версия того, что может напечатать эта команда (обратите внимание, что пакеты pip отмечены pypi):

# Name                    Version                   Build  Channel
pip                       19.2.2                   py37_0
python                    3.7.4                h5263a28_0
numpy                     1.16.4           py37h19fb1c0_0
pandas                    0.25.1           py37ha925a31_0
pyodbc                    4.0.27           py37ha925a31_0
ibm-db                    3.0.1                    pypi_0    pypi
ibm-db-sa                 0.3.5                    pypi_0    pypi

Наконец, это сокращенная версия того, как environment.ymlможет выглядеть (обратите внимание, что пакеты pip перечислены в отдельной категории):

dependencies:
  - pip=19.2.2=py37_0
  - python=3.7.4=h5263a28_0
  - numpy=1.16.4=py37h19fb1c0_0
  - pandas=0.25.1=py37ha925a31_0
  - pyodbc=4.0.27=py37ha925a31_0
  - pip:
    - ibm-db==3.0.1
    - ibm-db-sa==0.3.5

Имейте в виду, что совместное использование Conda и pip может вызвать некоторую изжогу, потому что они могут неосознанно уничтожить зависимости друг друга. Вы должны сначала установить все свои пакеты Conda, а затем все свои пакеты pip, а не чередовать их. Если ваша среда выходит из строя, официальная рекомендация - удалить и воссоздать ее (из вашегоenvironment.yml файла). Для получения дополнительной информации см. Это руководство:

https://www.anaconda.com/using-pip-in-a-conda-environment/

MarredCheese
источник