Wie werden Pipfile und Pipfile.lock verwendet?

130

Es scheint, dass Pipfile / Pipfile.lock im Zusammenhang mit Python-Paketen als Ersatz für require.txt gedacht sind. Es gibt jedoch nicht viel Dokumentation darüber, wie diese tatsächlich funktionieren. Ich habe hier im PyPi-Bereich der Python-Website eine sich entwickelnde Beschreibung von pipfile gefunden, aber sie ist ziemlich chaotisch und erklärt nicht die Semantik der verschiedenen Abschnitte der Datei.

Gibt es Hinweise zum Verständnis dieser Dateien?

Stephen
quelle
2
Dies ist ein direktes Analogon von Gemfileund Gemfile.lockaus der Ruby-Welt: Die .lockDatei hat spezifische Versionen für jede Abhängigkeit; Der ohne diese Erweiterung hat nur die Versionen, die dem kontrollierenden Menschen bekannt sind. Trotzdem ist es vielleicht etwas verfrüht, nach einer Erklärung für etwas zu fragen, das sich noch weiterentwickelt und weit davon entfernt ist, gut definiert und viel weniger standardisiert zu sein.
Charles Duffy
(In ähnlicher Weise besteht der Unterschied zwischen Pipfileund requirements.txthauptsächlich darin, dass erstere versuchen, Funktionen aus der Ruby-Welt zu übernehmen, dh in der Lage zu sein, Abhängigkeitssätze für mehrere Umgebungen und mit Bedingungen / Optionen / etc. In einer einzigen Datei anzugeben).
Charles Duffy
1
Es scheint, als ob es bereits im Heroku-Repo "Erste Schritte mit Python" ( github.com/heroku/python-getting-started.git ) bereitgestellt wurde. Ob es Ihnen gefällt oder nicht, es scheint produziert zu sein.
Stephen
Erwischt. Das heißt - die Dokumente sehen für mich ziemlich solide aus. Ich weiß nicht, was ich in einer Antwort schreiben könnte, die sie nicht nur neu formulieren würde.
Charles Duffy
1
Wenn Sie sich auf den Link beziehen, den ich im OP erstellt habe, werden einige Dinge weggelassen, zum Beispiel, was es eigentlich bedeutet, wenn sich etwas in einem Abschnitt namens source befindet.
Stephen

Antworten:

164

Das Konzept hinter diesen Dateien ist einfach und analog zu anderen bereits vorhandenen Tools, wenn Sie mit Ruby's Bundler oder Node's Npm vertraut sind. Pipenvist sowohl ein Paket- als auch ein Verwaltungstool für virtuelle Umgebungen, das die Dateien Pipfile und Pipfile.lock verwendet, um diese Ziele zu erreichen.

Pipenv verwaltet die virtuelle Umgebung für Sie auf eine Standardmethode (kein Aktivieren und Deaktivieren mehr erforderlich). Im Folgenden finden Sie einige Grundlagen für den Einstieg. Weitere Informationen finden Sie auf der pipenv-Website .

Loslegen

Die Verwendung von pipenv ist ganz einfach. Geben Sie in Ihrem Projektordner ...

$ pipenv install

... und wenn es bereits eine requirements.txtDatei hat, wird eine PipfileDatei mit den Anforderungen und einem Ordner für die virtuelle Umgebung generiert, andernfalls wird eine leere PipfileDatei generiert . Wenn Sie etwas, das Sie installiert haben, nicht mochten oder Ihre Meinung geändert haben, geben Sie einfach ...

$ pipenv uninstall <package>

... und du kannst loslegen. Um die virtuelle Umgebung zu aktivieren, die pipenv bereits generiert hat, gehen Sie zu ...

$ pipenv shell

... und Ihre virtuelle Umgebung wird aktiviert. Um die Umwelt zu verlassen ...

$ exit

... und Sie kehren zu Ihrer ursprünglichen Terminalsitzung zurück.

Pipfile

Die Pipfile- Datei soll die Paketanforderungen für Ihre Python-Anwendung oder -Bibliothek sowohl für die Entwicklung als auch für die Ausführung angeben. Sie können ein Paket installieren, indem Sie einfach ...

$ pipenv install flask

... und es wird als Abhängigkeit für die Bereitstellung und Ausführung oder durch Verwendung von ... hinzugefügt.

$ pipenv install --dev pytest

... und es wird als Abhängigkeit für die Entwicklungszeit verwendet. Die Dateisyntax ist wie folgt ziemlich einfach.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

Mit Pipfile.lock soll basierend auf den in Pipfile vorhandenen Paketen angegeben werden , welche spezifische Version davon verwendet werden soll, um das Risiko zu vermeiden, dass automatisch voneinander abhängige Pakete aktualisiert werden und Ihr Projektabhängigkeitsbaum beschädigt wird.

Sie können Ihre aktuell installierten Pakete mit ...

$ pipenv lock

... und das Tool sucht in Ihrem Ordner für die virtuelle Umgebung, um die Sperrdatei basierend auf den aktuell installierten Versionen automatisch für Sie zu generieren. Die Dateisyntax ist nicht so offensichtlich wie bei Pipfile . Aus Gründen der Übersichtlichkeit wird sie hier nicht angezeigt.

danieldeveloper001
quelle
Dies ist eine interessante Antwort, aber ich denke, als ich gefragt habe, konnte ich nicht ganz verstehen, was eigentlich damit gemeint [[source]]ist. Ist das die Quelle für die Pakete, die von pipenv oder etwas anderem heruntergeladen werden? Ich denke, der Rest der beiden Dateien ist offensichtlich genug.
Stephen
1
Ich gebe zu, ich fand es verwirrend, weil ich an einem Tutorial arbeite, in dem ich entscheiden muss, ob der Unterschied zwischen [package] / [dev-package] wichtig ist oder ob ich einfach alles in [package] einfügen soll. (Das Googeln hat mich zu dieser Seite geführt.) Aber beides zu haben, während ich Entwickler-Sachen in [Paket] steckte, warf mich irgendwie um. Ich konnte sehen, warum Anfragen in [Paket] sein sollten.
Al Sweigart
1
Geändert, wie gewünscht, um Verwirrung bei Entwicklungspaketen zu vermeiden, danke für
Ihren
1
Ich denke, es ist eine gute Idee, wenn Sie die Paketversionen während der Quellcode-Entwicklung verfolgen möchten, da die meisten Pakete mit einer Version versehen sind Pipfile. Wenn bei einem Paket-Upgrade etwas kaputt geht, sollte es durch Überprüfen des Paketversionsverlaufs behoben werden können. In der Tat empfiehlt einer der Ersteller der Anforderungsbibliothek, dies hier zu tun .
Danieldeveloper001
1
@ Stephen, es ist eigentlich das Gegenteil, wie in der Pipenv-Installationsdokumentation angegeben , können Sie das --skip-lockFlag angeben , um es zu zwingen, die Pipfile.lockDatei zu ignorieren , anstatt sie zu zwingen, sie zu verwenden;)
danieldeveloper001