Ich habe eine Pip-Anforderungsdatei, die sich während der Entwicklung ändert.
Kann pip
man Pakete deinstallieren , die nicht in der Anforderungsdatei enthalten sind, und diejenigen installieren, die angezeigt werden? Gibt es eine Standardmethode?
Dies würde es der Pip-Anforderungsdatei ermöglichen, die kanonische Liste von Paketen zu sein - ein "wenn und nur wenn" -Ansatz.
Update : Ich habe es als neue Funktion unter https://github.com/pypa/pip/issues/716 vorgeschlagen
Antworten:
Die kurze Antwort lautet nein, das kann man mit pip nicht machen.
quelle
pip uninstall -r requirements.txt
-y
Sie dem Befehl von @Ommit ein hinzu, um zu vermeiden, dass Sie Y drücken und viele Male eingeben müssen. Lerne aus meinen Fehlern.pip uninstall -r requirements.txt
Deinstalliert nur die Versionen in Ihrer Anforderung.txt. Wenn Sie beispielsweise deinstallierenboto3==1.10.0
,pip freeze
wird angezeigt,boto3==1.0.1
ob Sie es (oder eine ältere Version) zuvor installiert haben.Dies sollte alles deinstallieren, was nicht in der Datei require.txt enthalten ist:
Obwohl dies mit Paketen, die mit installiert wurden
-e
, dh aus einem Git-Repository oder ähnlichem, nicht ganz richtig funktioniert . Um diese zu überspringen, filtern Sie einfach Pakete heraus, die mit dem-e
Flag beginnen:Dann natürlich:
Update für 2016: Sie möchten den oben genannten Ansatz jedoch wahrscheinlich nicht wirklich anwenden. Check out
pip-tools
undpip-sync
das erreichen , was Sie wahrscheinlich in einer viel robusteren Art und Weise zu tun suchen.https://github.com/nvie/pip-tools
Update für Mai 2016:
Sie können jetzt auch verwenden
pip uninstall -r requirements.txt
, dies bewirkt jedoch im Grunde das Gegenteil - es deinstalliert alles inrequirements.txt
Update für Mai 2019:
Schauen Sie sich pipenv an . In der Welt des Paketmanagements ist viel passiert, was diese Art von Frage etwas überflüssig macht. Eigentlich benutze ich Pip-Tools aber immer noch recht gerne.
quelle
project.config
Datei für Django auf Elastic Beanstalk aufgenommen :05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Jetzt kann ich Pip-Pakete zurücksetzen, ohne meine Umgebung neu zu erstellen, indem ich nur Kommentare in verwenderequirements.txt
. Das erspart mir echte Ausfallzeiten. Danke dir!pip freeze
jemals ein#
am Anfang einer Zeile ausgegeben wird. Ich sehe in der Pip-Quelle nichts Offensichtliches, was darauf hindeutet, dass dies auch der Fall ist ( github.com/pypa/pip/blob/develop/pip/operations/freeze.py ), da die Anforderungsdateispezifikation dies zulässt, und Ich habe Leute gesehen, die es benutzt haben, ich habe es aufgenommen! pip.pypa.io/en/latest/reference/…Es ist kein Merkmal von
pip
, nein. Wenn Sie so etwas wirklich wollen, können Sie ein Skript schreiben, um die Ausgabepip freeze
mit Ihrer zu vergleichenrequirements.txt
, aber es wäre wahrscheinlich mühsamer als es wert ist.Mit
virtualenv
ist es einfacher und zuverlässiger, einfach eine saubere Umgebung zu erstellen und (neu) zu installieren vonrequirements.txt
:quelle
requirements.txt
), warum sollte es jemals wieder installiert werden?Sie können das
-r requirements.txt
Argument jetzt an übergebenpip uninstall
.Zumindest ab
pip
8.1.2pip help uninstall
zeigt:quelle
Dies ist eine alte (aber gute) Frage, und die Dinge haben sich seit ihrer Beantwortung erheblich geändert.
Es gibt einen spontanen Verweis auf eine
pip-sync
andere Antwort, der jedoch eine eigene Antwort verdient, da er genau das Problem des OP löst.pip-sync verwendet eine
requirements.txt
Datei als Eingabe und "korrigiert" Ihre aktuelle Python-Umgebung so, dass sie genau mit dem übereinstimmt , was darin enthalten istrequirements.txt
. Dies umfasst das Entfernen von Paketen, die in Ihrer Umgebung vorhanden sind, aber nicht vorhanden sindrequirements.txt
.Beispiel: Angenommen , wir unsere env (nur) 3 Bibliotheken enthalten sollen:
libA
,libB
, undlibC
, etwa so:Aber unsere Umgebung enthält derzeit
libC
undlibD
:Das Ausführen von pip-sync führt dazu, dass dies unser gewünschter Endzustand war:
quelle
Stephens Vorschlag ist eine nette Idee, aber leider funktioniert es nicht, wenn Sie nur direkte Anforderungen in Ihre Datei aufnehmen, was für mich sauberer klingt.
Alle Abhängigkeiten werden deinstalliert, auch gerade
distribute
, und brechen sichpip
selbst auf.Verwalten einer sauberen Anforderungsdatei während der Versionsverfolgung einer virtuellen Umgebung
So versuche ich, meine virtuelle Umgebung zu versionieren. Ich versuche, ein Minimum beizubehalten
requirements.txt
, einschließlich der direkten Anforderungen, und erwähne nicht einmal Versionsbeschränkungen, bei denen ich mir nicht sicher bin.Außerdem behalte ich den tatsächlichen Status meiner virtuellen Umgebung in einer
venv.pip
Datei und beziehe sie in die Versionsverfolgung (z. B. git) ein .Hier ist ein Beispielworkflow:
Richten Sie den virtuellen Arbeitsbereich mit Versionsverfolgung ein:
Versionsverfolgungssystem initialisieren:
Installieren Sie ein Paket mit Abhängigkeiten und fügen Sie es in die Anforderungsdatei ein:
Beginnen Sie nun mit dem Erstellen Ihrer App, legen Sie fest und starten Sie einen neuen Zweig:
Installieren Sie ein zusätzliches Paket:
... damit spielen und dann zur früheren Version zurückkehren
Deinstallieren Sie nun fremde Pakete:
Ich nehme an, der Prozess kann mit Git-Hooks automatisiert werden, aber lassen Sie uns nicht vom Thema abgehen.
Natürlich ist es dann sinnvoll, ein Paket-Caching-System oder ein lokales Repository wie pip2pi zu verwenden
quelle
Huckepack von @ stephen-j-gefahreny hier ist ein Powershell-Äquivalent, das ich benutze:
quelle
Während dies die Frage nicht direkt beantwortet,
requirements.txt
ist die Verwendung von a eine bessere Alternative zu jetztPipfile
. Dies funktioniert ähnlich wie bei einem RubyGemfile
. Derzeit müssen Sie daspipenv
Tool verwenden, aber hoffentlich wird dies irgendwann integriertpip
. Dies liefert denpipenv clean
Befehl, der macht, was Sie wollen.(Beachten Sie, dass Sie ein vorhandenes
requirements.txt
mit importieren könnenpipenv install -r requirements.txt
. Danach sollten Sie ein habenPipfile
und dasrequirements.txt
kann entfernt werden.)quelle
Es ist jetzt möglich mit:
quelle