Встановлюйте лише помилкові пакети, використовуючи “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, який, як повідомляє помилка, недоступний, може бути встановлений pip. Отже, якщо я можу змінити поведінку, conda install --yes --file requirements.txtщоб просто викинути попередження про недоступні пакунки, я можу виконати це за допомогою команди pip install -r requirments.txtв .travis.yml, тому TravisCI намагається встановити його з будь-якого місця, де воно доступне.

Відповіді:


171

У підсумку я просто переглянув рядки файлу

$ 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
Дякуємо за це, невелика підказка для тих, хто використовує його, переконайтесь, що ваші вимоги.
Txt закінчуються новим

1
Чи є спосіб також автоматично pip installпакетувати, які недоступні для використання conda install, під час ітерації?
PeterB

2
@delusionX, я розширив відповідь.
Till Hoffmann

11
Рішення @TillHoffmann на машині Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" працює дуже добре. Дякую!
Клей

3
Якщо ви зауважили у файлі вимог, pip багатословно скаржиться (дратує, якщо нешкідливо). Варіант while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
однокласника


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, так і піп-пакети, як зазначено в 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, а не чергувати їх. Якщо ваше середовище порушується, офіційна рекомендація - видалити та відтворити його (з вашого environment.ymlфайлу). Докладніше див. У цьому посібнику:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.