Installieren Sie nur verfügbare Pakete mit "conda install --yes --file require.txt" ohne Fehler


91

Während der Installation von Paketen in der Datei "resources.txt" mit Conda über den folgenden Befehl

conda install --yes --file requirements.txt

Wenn ein Paket in der Datei "resources.txt" nicht verfügbar ist, wird ein "Kein Paketfehler" wie der unten gezeigte ausgegeben:

Verwenden der Anaconda Cloud-API-Site https://api.anaconda.org

Paket-Metadaten abrufen: ....

Fehler: In den aktuellen Linux-64-Kanälen wurden keine passenden Pakete gefunden: nimfa == 1.2.3

Sie können dieses Paket auf anaconda.org mit suchen

anaconda search -t conda nimfa ==1.2.3

Kann dieses Verhalten geändert werden, anstatt einen Fehler auszulösen, sodass alle verfügbaren Pakete in der Datei "resources.txt" installiert werden und eine Warnung für diejenigen ausgegeben wird, die nicht verfügbar sind?

Ich möchte dies, weil das Paket nimfa, von dem der Fehler sagt, dass es nicht verfügbar ist, pip installiert werden kann. Wenn ich also das Verhalten ändern kann, conda install --yes --file requirements.txtum nur eine Warnung für nicht verfügbare Pakete pip install -r requirments.txtauszulösen , kann ich dem Befehl in .travis.yml folgen, damit TravisCI versucht, sie von jedem Ort aus zu installieren, an dem sie verfügbar ist.

Antworten:


166

Am Ende habe ich nur die Zeilen der Datei durchlaufen

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

Bearbeiten : Wenn Sie ein Paket mit pip installieren möchten, wenn es nicht über conda verfügbar ist, probieren Sie Folgendes aus:

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

Bearbeiten : Wenn Sie Windows verwenden (Guthaben geht an @Clay ):

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


5
Vielen Dank für diesen kleinen Hinweis für alle, die ihn verwenden. Stellen Sie sicher, dass Ihre Anforderung.txt mit einer neuen Zeile endet, damit das endgültige Paket eingelesen wird
Marawan Okasha,

1
Gibt es eine Möglichkeit, pip installPakete, die nicht verfügbar sind conda install, während der Iteration automatisch zu verwenden ?
PeterB

2
@delusionX, ich habe die Antwort erweitert.
Bis Hoffmann

11
@ TillHoffmanns Lösung auf einem Windows-Computer: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" Funktioniert sehr gut. Vielen Dank!
Clay

3
Wenn Sie Kommentare in der Anforderungsdatei haben, beschwert sich pip ausführlich (ärgerlich, wenn harmlos). Eine Variation des Bash- while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
Einzeilers,


1

Für diejenigen, die suchen, habe ich dies als @ TillHoffmanns Lösung für die Fischschale verwendet:

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

Und

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

1

Die Antwort von Pbms hier ist der richtige Weg, vorausgesetzt, Sie haben eine vorhandene Umgebung zum Kopieren. Conda ist in der Lage, sowohl Conda-Pakete als auch Pip-Pakete zu installieren, wie in aufgeführt environment.yml. Ich wollte den gesamten Prozess detaillierter dokumentieren. Beachten Sie, dass ich ordnerbasierte Umgebungen verwende, weshalb ich --prefix [path to environment folder]die meisten Befehle hinzugefügt habe.

Angenommen, Sie haben eine Umgebung für ein vorhandenes Projekt in einem Ordner installiert, envder im aktuellen Ordner aufgerufen wird , und zwar wie folgt:

conda create --prefix ./env

Sie würden environment.ymlfür die Umgebung dieses Projekts Folgendes generieren :

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

Sie würden eine neue Umgebung in einem anderen Ordner erstellen, indem Sie environment.ymldorthin kopieren und diese dann von dort aus ausführen:

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

Sie erhalten eine bereits vorhandene Umgebung, environment.ymlindem Sie sie erneut kopieren environment.ymlund von dort aus ausführen:

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

Wenn die betreffende Umgebung aktiv ist, überprüfen Sie den Status der Pakete wie folgt:

conda list

Dies ist eine gekürzte Version dessen, was dieser Befehl möglicherweise druckt (beachten Sie, dass die Pip-Pakete markiert sind 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

Schließlich ist dies eine gekürzte Version dessen environment.yml, wie es aussehen könnte (beachten Sie, dass die Pip-Pakete in ihrer eigenen Kategorie aufgeführt sind):

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

Beachten Sie, dass die gleichzeitige Verwendung von Conda und Pip zu Sodbrennen führen kann, da sie die Abhängigkeiten des anderen unwissentlich aufheben können. Sie sollten zuerst alle Ihre Conda-Pakete und anschließend alle Ihre Pip-Pakete installieren, anstatt zwischen den beiden zu wechseln. Wenn Ihre Umgebung kaputt geht, wird offiziell empfohlen, sie zu löschen und neu zu erstellen (aus Ihrer environment.ymlDatei). Weitere Informationen finden Sie in diesem Handbuch:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.