Zainstaluj tylko dostępne pakiety przy użyciu polecenia „conda install --yes --file Requirements.txt” bez błędów

100

Podczas instalowania pakietów w Requirements.txt przy użyciu Conda za pomocą następującego polecenia

conda install --yes --file requirements.txt

Jeśli pakiet w pliku Requirements.txt nie jest dostępny, zgłasza błąd „Brak pakietu”, taki jak ten pokazany poniżej:

Korzystanie z witryny Anaconda Cloud api https://api.anaconda.org

Pobieranie metadanych pakietu: ....

Błąd: w bieżących kanałach linux-64 nie znaleziono pakietów: nimfa == 1.2.3

Możesz wyszukać ten pakiet na anaconda.org za pomocą

anaconda search -t conda nimfa ==1.2.3

Czy zamiast zgłaszać błąd, można zmienić to zachowanie, tak aby instalowało wszystkie dostępne pakiety w pliku Requirements.txt i wyświetlało ostrzeżenie dla tych, które nie są dostępne?

Chciałbym to, ponieważ pakiet nimfa, o którym mówi błąd, jest niedostępny, można zainstalować pip. Więc jeśli mogę zmienić zachowanie, conda install --yes --file requirements.txtaby po prostu wyrzucić ostrzeżenie o niedostępnych pakietach, mogę wykonać polecenie za pomocą polecenia pip install -r requirments.txtw .travis.yml, więc TravisCI spróbuje zainstalować go z dowolnego miejsca, w którym jest dostępny.

cdeepakroy
źródło

Odpowiedzi:

174

Skończyło się na iteracji po liniach pliku

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

Edycja : Jeśli chcesz zainstalować pakiet przy użyciu pip, jeśli nie jest on dostępny przez conda, spróbuj:

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

Edycja : Jeśli używasz systemu Windows (kredyt trafia do @Clay ):

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

Till Hoffmann
źródło
5
Dzięki za to, mała wskazówka dla każdego, kto go używa, upewnij się, że Twoje wymagania.txt kończą się nową linią, tak aby ostateczny pakiet został odczytany
Marawan Okasha
1
Czy istnieje sposób, aby podczas iteracji również automatycznie pip installużywać pakietów, które nie są dostępne conda install?
PeterB
2
@delusionX, rozszerzyłem odpowiedź.
Till Hoffmann
11
Rozwiązanie @TillHoffmann na komputerze z systemem Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" działa bardzo dobrze. Dzięki!
Clay
3
Jeśli masz komentarze w pliku wymagań, pip narzeka wulgarnie (denerwujące, jeśli nieszkodliwe). Odmiana bash one-liner, która ignoruje komentarze:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Dla tych, którzy szukają, użyłem tego jako rozwiązania @TillHoffmann dla muszli rybnej:

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

I

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
Yuri-M-Dias
źródło
1

Odpowiedź Pbms to właściwy sposób na zrobienie tego, zakładając, że masz istniejące środowisko do skopiowania. Conda jest w pełni zdolna do instalowania zarówno pakietów Conda, jak i pakietów pip, jak wymieniono w environment.yml. Chciałem bardziej szczegółowo udokumentować cały proces. Zauważ, że używam środowisk opartych na folderach, dlatego dodałem--prefix [path to environment folder] do większości poleceń.

Załóżmy, że zainstalowałeś środowisko dla istniejącego projektu w folderze o nazwie envw bieżącym folderze, na przykład:

conda create --prefix ./env

Wygenerowałbyś environment.ymldla środowiska tego projektu w następujący sposób:

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

Utworzyłbyś nowe środowisko w innym folderze, kopiując environment.ymldo niego, a następnie uruchamiając to stamtąd:

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

Otrzymasz już istniejące środowisko do dopasowania environment.yml, ponownie kopiując environment.ymltam, a następnie uruchamiając to stamtąd:

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

Gdy dane środowisko jest aktywne, należy zweryfikować stan jego pakietów w następujący sposób:

conda list

To jest skrócona wersja tego, co może wydrukować to polecenie (zwróć uwagę, że pakiety pip są oznaczone 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

Wreszcie, jest to skrócona wersja tego, co environment.ymlmoże wyglądać (zwróć uwagę, że pakiety pip są wymienione w swojej własnej kategorii):

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

Pamiętaj, że używanie Conda i pip razem może powodować zgagę, ponieważ mogą one nieświadomie zniszczyć wzajemne zależności. Powinieneś najpierw zainstalować wszystkie swoje pakiety Conda, a potem wszystkie pakiety pip, zamiast przełączać się między nimi. Jeśli twoje środowisko się zepsuje, oficjalnym zaleceniem jest jego usunięcie i ponowne utworzenie (z environment.ymlpliku). Więcej informacji można znaleźć w tym przewodniku:

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

MarredCheese
źródło