Ersetzt Conda die Notwendigkeit von virtualenv?


205

Ich habe kürzlich Conda entdeckt nachdem ich Probleme bei der Installation von SciPy hatte, insbesondere auf einer Heroku-App, die ich entwickle.

Mit Conda erstellen Sie Umgebungen, die denen von virtualenv sehr ähnlich sind . Meine Fragen sind:

  1. Wenn ich Conda verwende, wird es die Notwendigkeit von virtualenv ersetzen? Wenn nicht, wie verwende ich die beiden zusammen? Installiere ich virtualenv in Conda oder Conda in virtualenv?
  2. Muss ich noch pip verwenden? Wenn ja, kann ich weiterhin Pakete mit pip in einer isolierten Umgebung installieren?

Wenn Sie daran interessiert sind, Conda und Pip auf Heroku zu verwenden, sehen Sie zum Beispiel github.com/faph/conda-pip-buildpack
faph

Vielen Dank. Mir ist aufgefallen, dass es für Heroku auf Github eine ganze Reihe von Conda-Buildpacks gibt. Welche Faktoren sollte ich berücksichtigen, wenn ich mich für ein Buildpack entscheide?
Kritz

Beachten Sie, dass Sie pip weiterhin verwenden müssen, wenn Sie Pakete installieren möchten, die nicht direkt von den Continuum-Servern verfügbar sind.
Ali_m

Ja, ich habe gesehen, dass sie immer noch auf Django 1.8 (nicht 1.9) sind. Im Moment werde ich Conda verwenden, wo es nötig ist (scipy und numpy) und pip für alles andere - aber immer noch innerhalb von conda.
Kritz

Die meisten Conda Heroku Buildpacks stammen von Kenneth Reitz, glaube ich. Mit Leuten, die sie an ihre Vorlieben anpassen. Überprüfen Sie einfach, ob sie sowohl Conda- als auch Pip-Unterstützung enthalten, wenn Sie dies benötigen. Und wenn sie die Datei environment.yml unterstützen. Sie können jederzeit schnell im Buildpack-Code nachsehen, ob Ihnen das Build-Skript gefällt, beispielsweise um festzustellen, wie genau Umgebungen erstellt werden.
Faph

Antworten:


157
  1. Conda ersetzt virtualenv. Meiner Meinung nach ist es besser. Es ist nicht auf Python beschränkt, sondern kann auch für andere Sprachen verwendet werden. Nach meiner Erfahrung bietet es eine viel reibungslosere Erfahrung, insbesondere für wissenschaftliche Pakete. Das erste Mal, dass ich MayaVi richtig auf dem Mac installiert habe, war mit conda.

  2. Sie können immer noch verwenden pip. In der Tat wird in jeder neuen Umgebung condainstalliert pip. Es kennt Pip-installierte Pakete.

Beispielsweise:

conda list

listet alle in Ihrer aktuellen Umgebung installierten Pakete auf. Von Conda installierte Pakete werden folgendermaßen angezeigt:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

und diejenigen, die über installiert sind, piphaben den <pip>Marker:

wxpython-common           3.0.0.0                   <pip>

8
Gibt es irgendwelche Nachteile bei der Verwendung von Pip in einer Anaconda-Umgebung? Gibt es jemals einen Fall, in dem Sie pip verwenden möchten, obwohl ein Paket über Conda erhältlich war?
Clifgray

Der Unterschied ist Bindestrich gegen Unterstrich? Was ist, wenn der Paketname keine hat? Wie kann man dann unterscheiden?
Tom Hale

1
Der Unterstrich oder Bindestrich ist Teil des Paketnamens. Dies hat nichts mit Pip oder Conda zu tun. Das <pip>zeigt, dass es mit pip installiert wurde, ansonsten wird es mit conda installiert.
Mike Müller

4
Es gibt eine große Einschränkung mit "conda kennt sich mit Pip-installierten Paketen aus". Nach meinem Verständnis agiert pip in einer conda env unabhängig, sodass conda beispielsweise installierte pip-Pakete nicht deinstallieren kann
information_interchange

1
@clifgray - Pip- und Conda-Pakete mit nativen gemeinsam genutzten Bibliotheken installieren möglicherweise inkompatible Binärversionen von solchen, die dazu führen, dass alle Arten von Fehlern in der nativen Welt (sigsegv-s usw.) für jemanden schwer zu debuggen sind, der mit einem C-Debugger nicht auf dem neuesten Stand ist. Das Gleiche gilt für reine Python-Pakete, nur dass diese leicht zu verstehen sind.
Bobah

61

Kurze Antwort ist, Sie brauchen nur conda.

  1. Conda kombiniert die Funktionen von pip und virtualenv effektiv in einem einzigen Paket, sodass Sie virtualenv nicht benötigen, wenn Sie conda verwenden.

  2. Sie wären überrascht, wie viele Pakete conda unterstützt. Wenn es nicht ausreicht, können Sie pip under conda verwenden.

Hier ist ein Link zur Conda-Seite, auf der Conda, Pip und Virtualenv verglichen werden:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands .


34

Virtuelle Umgebungen und pip

Ich werde das hinzufügen Erstellen und Entfernen von Conda-Umgebungen mit Anaconda einfach ist.

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

In einem (n Installieren Sie aktivierten Umgebung Pakete über condaoder pip:

(envname)> conda install <package>

(envname)> pip install <package>

Diese Umgebungen sind stark an die pip-ähnliche Paketverwaltung von conda gebunden , sodass es einfach ist, Umgebungen zu erstellen und sowohl Python- als auch Nicht-Python-Pakete zu installieren.


Jupyter

Zusätzlich, Installationipykernel in einer Umgebung eine neue Liste im Dropdown-Menü Kernel von Jupyter-Notebooks hinzugefügt, wodurch reproduzierbare Umgebungen auf Notebooks erweitert werden. Ab Anaconda 4.1 wurden Erweiterungen hinzugefügt , mit denen Notebooks einfacher erweitert werden können.

Verlässlichkeit

Nach meiner Erfahrung ist conda schneller und zuverlässiger bei der Installation großer Bibliotheken wie numpyund pandas. Wenn Sie den erhaltenen Zustand einer Umgebung übertragen möchten, können Sie dies auch tun, indem Sie eine Umgebung freigeben oder klonen .


18

Durch die Installation von Conda können Sie Python-Umgebungen nach Ihren Wünschen erstellen und entfernen und erhalten somit die gleichen Funktionen wie virtualenv .

Bei beiden Distributionen können Sie einen isolierten Dateisystembaum erstellen, in dem Sie Python-Pakete (wahrscheinlich mit pip) nach Ihren Wünschen installieren und entfernen können. Dies kann nützlich sein, wenn Sie unterschiedliche Versionen derselben Bibliothek für unterschiedliche Anwendungsfälle haben möchten oder einfach nur eine Distribution ausprobieren und diese anschließend entfernen möchten, um Speicherplatz zu sparen.

Unterschiede:

Lizenzvereinbarung. Während virtualenv unter die liberalste MIT-Lizenz fällt, Conda eine BSD-Lizenz mit drei Klauseln.

Conda bietet Ihnen ein eigenes Paketkontrollsystem. Dieses Paketsteuerungssystem bietet häufig vorkompilierte Versionen (für die meisten gängigen Systeme) gängiger Nicht-Python-Software, mit denen sich einige maschinelle Lernpakete auf einfache Weise zum Laufen bringen lassen. Sie müssen nämlich keinen optimierten C / C ++ - Code für Ihr System kompilieren. Während es für die meisten von uns eine große Erleichterung ist, kann es die Leistung solcher Bibliotheken beeinträchtigen.

Im Gegensatz zu virtualenv dupliziert Conda einige Systembibliotheken zumindest auf Linux-Systemen. Diese Bibliotheken können nicht mehr synchron sein, was zu einem inkonsistenten Verhalten Ihrer Programme führt.

Urteil:

Conda ist großartig und sollte Ihre Standardwahl sein, wenn Sie mit maschinellem Lernen beginnen. Sie sparen Zeit beim Spielen mit gcc und zahlreichen Paketen. Conda ersetzt jedoch nicht virtualenv. Dies führt zu einer zusätzlichen Komplexität, die möglicherweise nicht immer erwünscht ist. Es kommt unter anderer Lizenz. Möglicherweise möchten Sie die Verwendung von conda in verteilten Umgebungen oder auf HPC-Hardware vermeiden.


2
Möchten Sie etwas näher darauf eingehen, warum "Sie die Verwendung von Conda in verteilten Umgebungen oder auf HPC-Hardware vermeiden möchten"? @ y.selivonchyk
Oliver Hu

1
Ich bin mit einigen dieser Schlussfolgerungen nicht einverstanden. "Inkonsistentes Programmverhalten" ist das Ergebnis einer nicht ordnungsgemäßen Konfiguration Ihrer Programme für die Verwendung der condainstallierten Software und Bibliotheken. Und in HPC condaist es in vielen Fällen vorzuziehen, tatsächlich wird es von HPC-Administratoren verwendet, um Dinge wie moduleSysteme zu ersetzen . Es ermöglicht vom Benutzer installierte Software und eine stärkere Software-Isolation, zwei große Probleme bei HPC. Die einzige Einschränkung, die ich erlebe, ist, dass viele HPC-Dateisysteme die Anzahl der Dateien in einem Verzeichnis stark einschränken und conda viele 1000 Dateien erstellt.
user5359531

9

Ich benutze beide und (Stand: Januar 2020) sie haben einige oberflächliche Unterschiede, die sich für mich für unterschiedliche Verwendungen eignen. Mit dem Standard bevorzugt Conda eine Liste der Umgebungen für Sie in einem zentralen Standort aus zu verwalten, während virtualenv einen Ordner im aktuellen Verzeichnis macht. Ersteres (zentralisiert) ist sinnvoll, wenn Sie z. B. maschinelles Lernen betreiben und nur über ein paar breite Umgebungen verfügen, die Sie in vielen Projekten verwenden und von überall aus darauf zugreifen möchten. Letzteres (pro Projektordner) ist sinnvoll, wenn Sie kleine einmalige Projekte mit völlig unterschiedlichen Lib-Anforderungen durchführen, die wirklich mehr zum Projekt selbst gehören.

Die leere Umgebung, die Conda erstellt, ist ungefähr 122 MB groß, während die virtuelle Umgebung ungefähr 12 MB groß ist. Dies ist ein weiterer Grund, warum Sie Conda-Umgebungen möglicherweise nicht überall verteilen möchten.

Ein weiterer oberflächlicher Hinweis darauf, dass Conda seine zentralisierten Envs bevorzugt, ist, dass (wieder standardmäßig), wenn Sie eine Conda-Env in Ihrem eigenen Projektordner erstellen und aktivieren, das in Ihrer Shell angezeigte Namenspräfix das (viel zu lange) Absolut ist Pfad zum Ordner. Sie können dies beheben, indem Sie ihm einen Namen geben, aber virtualenv macht standardmäßig das Richtige.

Ich gehe davon aus, dass diese Informationen schnell veralten werden, wenn die beiden Paketmanager um die Vorherrschaft kämpfen, aber dies sind die Kompromisse ab heute :)


Gute Erklärung! Haben Sie Schwierigkeiten, beide zu verwenden? Hast du jemals benutzt pipenv?
Mikhail_Sam

8

Eine weitere neue Option und meine derzeit bevorzugte Methode, um eine Umgebung zum Laufen zu bringen, ist Pipenv

Es ist derzeit das offiziell empfohlene Python-Verpackungstool von Python.org


1
Dies führte zu "eh? Was ist pipenv?", Was mich zu reddit.com/r/Python/comments/8jd6aq/… und sedimental.org/the_packaging_gradient.html führte . Ich weiß immer noch nicht, was ich verwenden soll, aber zumindest bin ich besser informiert. Meiner Ansicht nach.
Matt Wilkie

Nach dem Anschauen des Intro und dem schnellen Lesen der Einführung scheint pipenv nicht in der Lage zu sein, Python-Versionen zu verwalten ...
Carles Alcolea

@ CarlesAlcolea pipenv kann die verschiedenen Versionen auch angeben durch: pipenv --twofür Python2 und pipenv - drei für Python3
Kurian Benoy

3

Ja, condaist viel einfacher zu installieren als virtualenvund ersetzt letzteres.


6
Warum bietet Anaconda Anweisungen zum Installieren einer virtuellen Umgebung, wenn diese diese ersetzt?
jmh

1
@jmh Anaconda ersetzt keine virtuellen Umgebungen, sondern das Python-spezifische Verwaltungstool für virtuelle Umgebungen virtualenvdurch ein allgemeineres Verwaltungstool für virtuelle Umgebungen conda. Außerdem ist Anaconda nur eine Python + -Distribution, die das Conda-Tool enthält. Die Frage (und Antwort) betrifft nur Conda.
Merv

3
Diese Antwort fügt nichts hinzu, was über die Antworten hinausgeht, die Jahre zuvor kamen.
Merv

1

Ich arbeite in Unternehmen, hinter mehreren Firewalls mit Maschinen, auf denen ich keinen Administratorzugriff habe

In meiner begrenzten Erfahrung mit Python (2 Jahre) bin ich auf einige Bibliotheken (JayDeBeApi, sasl) gestoßen, die bei der Installation über Pip einen Fehler mit C ++ - Abhängigkeitsfehlern verursachten: Microsoft Visual C ++ 14.0 ist erforderlich. Holen Sie es sich mit "Microsoft Visual C ++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

diese wurden gut mit conda installiert, daher habe ich seit jenen Tagen angefangen, mit conda env zu arbeiten. Es ist jedoch nicht einfach zu verhindern, dass conda Abhängigkeiten in c.programfiles installiert, auf die ich keinen Schreibzugriff habe.

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.