Überarbeitung der Python-Verpackung mit Pipenv

Überblick

Python ist eine der freundlichsten und dennoch mächtigsten Sprachen. Es ist für Anfänger leicht zu erlernen, hat jedoch einen starken Schlag und wird in verschiedenen Bereichen wie der wissenschaftlichen Programmierung, der Programmierung von Webanwendungen und DevOps umfangreich eingesetzt. Einer der Schwachpunkte von Python war jedoch die Unterstützung für das Packen komplexer Anwendungen und ihrer Abhängigkeiten. 

Im Laufe der Jahre gab es viele Anstrengungen, um die Situation zu verbessern. Im August 2017 schrieb ich ein Tutorial zum Stand der Technik in Python-Verpackungen: Schreiben, Verpacken und Verteilen einer Bibliothek in Python. 

Es ist erst vier Monate her und es gibt einen neuen Spieler in der Stadt. Pipenv ist jetzt das offiziell empfohlene Werkzeug für das Verpacken von PyPA (Python Packaging Authority). In diesem Lernprogramm erfahren Sie, warum Pipenv den Status der Verpackung und des gesamten Entwicklungsworkflows für Python-Entwickler erheblich verbessert und wie dies effektiv genutzt werden kann.

Python Dev Workflow für Menschen

Das Ziel von Pipenv ist es, den Entwicklungsworkflow von Python-Entwicklern beim Verwalten von Abhängigkeiten und virtuellen Umgebungen zu verbessern. Es ist eine weitere schöne Bibliothek des fleißigen Kenneth Reitz, der vor allem für das Request-Paket (HTTP für Menschen) bekannt ist, aber ein paar andere hervorragende Pakete schrieb. 

Brauchen wir noch ein anderes Verpackungswerkzeug??

Ja das tun wir! Pipenv greift eine Seite aus modernen Paketverwaltungspraktiken auf und importiert sie in die Python-Welt. 

Pipenv installieren

Sie können Pipenv mit installieren pip install pipenv. Sie erhalten eine schöne Ausgabe mit Emojis:

$ pip install pipenv ✨🍰✨ 

Sie müssen es nur einmal tun. Wenn Sie pip nicht installiert haben, können Sie den folgenden Bootstrap-Befehl verwenden: $ curl https://github.com/pypa/pipenv/blob/master/get-pipenv.py | Python

Pipfile und Pipfile.lock

Pipenv kann eine leere virtuelle Umgebung für Sie erstellen. Hier ist eine kurze Demo: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv --dree Ausgabe: Erstellen einer Virtualenv für dieses Projekt… Erstellen von Virtualenv mit / usr / local / bin / python3… ⠋ Ausführen von Virtualenv mit Interpreter / usr / local / bin / python3 Basispräfix verwenden '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Neue ausführbare Python-Datei in /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Erstellen von ausführbaren Dateien in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installieren von Setuptools, Pip, Wheel ... fertig. Virtualenv-Speicherort: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Erstellen einer Pipdatei für dieses Projekt… 

Dadurch wird eine leere Pip-Datei ohne Abhängigkeiten erstellt. Da Sie jedoch wahrscheinlich einige Pakete für Ihr Projekt installieren möchten, können Sie einfach mit pipenv ein Paket installieren, und die virtuelle Umgebung wird automatisch erstellt. Zum Beispiel:

~ / git / testpipenv> pipenv Installationsanfragen ausgeben Ausgabe: Anforderungen installieren ... Anforderungen zusammenstellen Verwendung zwischengespeicherter Anforderungen-2.18.4-py2.py3-none-any.whl IDNA sammeln<2.7,>= 2.5 (aus Anfragen) Verwenden von zwischengespeicherten idna-2.6-py2.py3-none-any.whl Sammlungs-Chardet<3.1.0,>= 3.0.2 (von Anforderungen) Verwenden von zwischengespeicherten chardet-3.0.4-py2.py3-none-any.whl Sammeln von Zertifikaten> = 2017.4.17 (von Anforderungen) Verwenden von zwischengespeicherten Zertifikaten-2017.11.5-py2.py3-none- any.whl Sammeln von urllib3<1.23,>= 1.21.1 (aus Abfragen) Verwenden des zwischengespeicherten urllib3-1.22-py2.py3-none-any.whl Installieren der gesammelten Pakete: idna, chardet, certifi, urllib3, Anforderungen Erfolgreich installiert certifi-2017.11.5 chardet-3.0.4 idna- 2.6 request-2.18.4 urllib3-1.22 Hinzufügen von Requests zu Pipfiles [Paketen]… PS: Sie haben einen ausgezeichneten Geschmack! Dev 🍰 ✨ Sperren von Abhängigkeiten von [dev-packages]… Sperren von Abhängigkeiten von [Paketen]… Aktualisierte Pipfile.lock (7b8df8)! 

Der Detaillierungsgrad ist ausgezeichnet und es werden auch schöne Farben verwendet. Hier ist das resultierende Pipfile:

[[source]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" [dev-packages] [packages] request = "*" [erfordert] python_version = "3.6" 

Die Pipfile verfolgt die Abhängigkeiten Ihres Projekts auf oberster Ebene - hier Anfragen = "*". Es verwendet TOML als Format, das heutzutage eine beliebte Wahl für Konfigurationsdateien ist (Rust's Cargo, Python's PEP-518).. 

Die Pipefile.lock-Datei ist dagegen eine JSON-Datei, die einige Metadaten und die genauen Versionen (einschließlich Hashes) aller rekursiven Abhängigkeiten (Abhängigkeiten auf oberster Ebene und ihre Abhängigkeiten) angibt. Hier ist die Pipfile.lock-Datei:

"_meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "host-environment-marker": "Implementierungsname": "cpython", "Implementation_name": "cpython" "" ". : "posix", "platform_machine": "x86_64", "platform_python_implementation": "CPython", "platform_release": "16.7.0", "platform_system": "Darwin", "platform_version": "Darwin Kernel Version 16.7.0 : Mi Oct 4 00:17:00 PDT 2017; root: xnu-3789.71.6 ~ 1 / RELEASE_X86_64 "," python_full_version ":" 3.6.3 "," python_version ":" 3.6 "," sys_platform ":" darwin " , "pipfile-spec": 6, "erfordert": "python_version": "3.6", "sources": ["name": "pypi", "url": "https: //pypi.python .org / simple " "verify_ssl": true], "default":  "zertifi":  "Hashes": [ "sha256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", "sha256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0"], "Version":" == 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "sha256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "Version": "== 3.0.4", "IDNA":  "Hashes": [ "sha256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "sha256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "Version": "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" Und "0 - und" - 0 - / -> - 0 - - - / - / - / - zu--N--Auf----------------------------------------ales -ge--Netzwerkumgebung zu der Produktpalette ": [" sha256: 06pin306d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e4a3b9eabb1b "," sha256: cc44da8e1145637334317feebd728bd869a835a8bbbbb1bbbbb1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cc44da8e1145637334317e 

Wenn Sie ein Diagramm aller Abhängigkeiten anzeigen möchten, geben Sie Folgendes ein: pipenv graph

~ / git / testpipenv> pipenv-graphische Anfragen == 2.18.4 - certifi [erforderlich:> = 2017.4.17, installiert: 2017.11.5] - chardet [erforderlich:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2.5, installiert: 2.6] - urllib3 [erforderlich:> = 1.21.1,<1.23, installed: 1.22]

Installierte Pakete mit Pipenv verwenden

Wenn Sie ein Paket mit Pipenv installiert haben, können Sie es wie ein Standardpaket in Ihrer virtuellen Umgebung aufrufen (genauso wie bei einer Pip-Installation). Die einzige Vorsichtsmaßnahme besteht darin, dass Sie Ihren Interpreter für virtuelle Umgebungen verwenden müssen. Pipenv bietet zwei hilfreiche Befehle: Lauf und Schale

Sie verwenden pipenv Python ausführen .py um Ihr Programm auszuführen und verwenden Sie Pipenv-Schale Starten Sie eine neue Shell mit Ihrem virtuellen Python-Interpreter. Mit dem Shell-Befehl können Sie eine interaktive Python-Sitzung starten, in der das installierte Anforderungspaket verwendet wird, um ein Angebot des Tages von einer REST-API abzurufen. Die virtuelle Umgebung ist aktiviert, und beim Starten von Python wird der richtige Interpreter verwendet Anfragen ist verfügbar.

~ / git / testpipenv> pipenv-shell Spawn-Umgebungs-Shell (/ bin / bash). Verwenden Sie 'exit' zum Verlassen. source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate ~ / git / testpipen / v> source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GD6y/bin/ (testpipenv-0GShD6dy) ~ / git / testpipenv> python Python 3.6.3 (Standardeinstellung: 19. November 2017, 16:39:12) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] auf Darwin Geben Sie "help", "copyright", "credits" oder "license" ein, um weitere Informationen zu erhalten. >>> Importanfragen >>> r = request.get ('https://quotes.rest/qod') >>> r.ok True >>> r.json () 'success': 'total' : 1, 'Inhalt': 'Zitate': ['Zitat': 'Abhängen mit Leuten, die besser sind als Sie', 'Autor': 'Warren Buffett', 'Länge': Keine, 'Tags' : ['besser werden', 'inspirieren', 'leute'], 'kategorie': 'inspirieren', 'titel': 'inspirierendes Zitat des Tages', 'datum': '2018-01-03', ' id ': Keine],' copyright ':' 2017-19 theysaidso.com ' >>> quote = r.json () [' content '] [' quotes '] [0] [' quote ']> >> author = r.json () ['content'] ['quotes'] [0] ['author'] >>> drucken (f 'quote ~~ author') Mit Leuten zusammen sein, die sind Besser als du. ~~ Warren Buffett >>>

Importieren aus Requirements.txt

Wenn Sie ein vorhandenes Projekt mit einer Requirements.txt migrieren möchten, ist Pipenv für Sie zuständig. Einfach: pipenv install -r .

Alle Ihre Abhängigkeiten werden in die Pipfile importiert. Um die Abhängigkeiten tatsächlich zu installieren und die Pipfile.lock zu generieren, müssen Sie dies tun pipenv installieren. Wenn Sie sich vergewissert haben, dass alles wie erwartet funktioniert, können Sie die Datei „Requirements.txt“ löschen.

Wenn sich Ihre Requirements.txt in demselben Verzeichnis befindet, in dem Sie die virtuelle Umgebung erstellt haben, generiert Pipenv automatisch die Pipfile. Denken Sie jedoch daran, dass Ihre Anforderungen.txt-Datei gepinnte Versionen enthält, die ebenfalls in der Pipfile gespeichert werden. In der Pipenv-Welt sollte das Pinning in der Pipfile.lock-Datei erfolgen. Pipenv wird eine freundliche Erinnerung geben. Siehe unten:

~ / git / testpipenv> cat Requirements.txt request == 2.18.4 ~ / git / testpipenv> pipenv --dree Erstellen einer Virtualenv für dieses Projekt… Erstellen von Virtualenv mit / usr / local / bin / python3… ⠋ Ausführen von Virtualenv mit Interpreter / usr / local / bin / python3 Basispräfix verwenden '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Neue ausführbare Python-Datei in /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Erstellen von ausführbaren Dateien in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installieren von setuptools, pip, wheel ... fertig. Virtualenv-Speicherort: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Anforderungs.txt anstelle von Pipfile gefunden! Konvertieren… Warnung: Ihre Pipfile enthält jetzt gepinnte Versionen, wenn Ihre Anforderungen.txt dies tun. Wir empfehlen, Ihre Pipfile zu aktualisieren, um stattdessen die "*" -Version anzugeben. 

Hier ist die angeheftete Version in der Pipdatei, die empfohlen wird, zu "*" zu wechseln:

[packages] request = "== 2.18.4" 

Lassen Sie uns jetzt die Abhängigkeiten installieren:

~ / git / testpipenv> pipenv install Pipfile.lock wurde nicht gefunden und erstellt ... Sperren von [dev-packages] Abhängigkeiten ... Sperren von [Paketen] Abhängigkeiten ... Aktualisierte Pipfile.lock (0b0daf)! Abhängigkeiten von Pipfile.lock (0b0daf) installieren… 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 Um die Virtualenv dieses Projekts zu aktivieren, führen Sie Folgendes aus: $ pipenv shell ~ / git / testpipenv>

Bearbeitbare Abhängigkeiten

Sie können Pipenv anweisen, einen Pfad als editierbar zu installieren. Dies ist nützlich, wenn Sie sich auf Pakete verlassen, die Sie entwickeln, und auf Ihr Quellpaket angewiesen sein möchten, ohne sie bei jeder Änderung tatsächlich zu installieren. Dies ist insbesondere für das aktuelle Verzeichnis hilfreich, wenn Sie aktiv daran arbeiten. Verwenden Sie dazu die -e und --dev Flaggen:

> pipenv install '-e.' --dev

Sie benötigen eine korrekte setup.py-Datei.

Verwalten Sie Ihre Umgebung mit Pipenv

Sie haben schon viel gesehen, was Pipenv für Sie tun kann. Lassen Sie uns näher auf einige zusätzliche Befehle und Optionen eingehen.

Pakete installieren

Das pipenv installieren Befehl unterstützt mehrere Optionen:

  • --dev: Installieren Sie sowohl Entwicklungs- als auch Standardpakete aus Pipfile.lock.
  • --System: Verwenden Sie den Befehl Systempip anstelle des Befehls aus Ihrer Virtualenv.
  • --ignore-pipfile: Ignorieren Sie die Pipfile und installieren Sie sie aus der Pipfile.lock.
  • --Überspringen: Ignorieren Sie die Pipfile.lock und installieren Sie sie aus der Pipfile. Schreiben Sie außerdem keine Pipfile.lock, die Änderungen an der Pipfile widerspiegelt. 

Abhängig von Ihrem Workflow und Ihren Präferenzen möchten Sie möglicherweise eine oder mehrere dieser Optionen zu unterschiedlichen Zeitpunkten verwenden.

Pakete deinstallieren

Um eine Abhängigkeit zu deinstallieren, geben Sie Folgendes ein: pipenv deinstallieren . Zum Beispiel:

~ / git / testpipenv> Deinstallationsanfragen von pipenv Deinstallation von Anforderungen… Deinstallieren von Anforderungen-2.18.4: Anforderungen erfolgreich deinstalliert-2.18.4 Anforderungen von Pipfile entfernen… Abhängigkeiten von [dev-packages] blockieren [Abhängigkeiten] von [Paketen]… Aktualisierte Pipfile. Verriegelung (625834)! 

Beachten Sie, dass ich bei der Deinstallation nicht "request == 2.8.14" angeben musste, obwohl es in der Pipfile festgehalten wurde.

Abhängigkeiten sperren

Wenn Sie eine Momentaufnahme Ihrer aktuellen Abhängigkeiten (z. B. vor einem Release) erstellen möchten, verwenden Sie den Befehl lock. Dies ist der Schlüssel zu deterministischen und wiederholbaren Builds: pipenv lock --pre.

Entfernen der virtuellen Umgebung

Pipenv ist großartig, aber Sie können gelegentlich einige Ihrer virtuellen Umgebungen bereinigen. Es ist so einfach wie pipenv --rm.

Sicherheit

Pipfile.lock nutzt einige wichtige neue Sicherheitsverbesserungen in pip. Standardmäßig wird das Pipfile.lock mit den sha256-Hashwerten jedes heruntergeladenen Pakets generiert. Dadurch kann pip garantieren, dass Sie das installieren, was Sie beabsichtigen, wenn Sie sich in einem gefährdeten Netzwerk befinden, oder Abhängigkeiten von einem nicht vertrauenswürdigen PyPI-Endpunkt herunterladen.

Darüber hinaus bietet Pipenv die prüfen Befehl, der die Übereinstimmung mit PEP 508 prüft - Abhängigkeitsspezifikation für Python-Softwarepakete sowie Paketsicherheit:

~ / git / testpipenv> pipenv check. PEP 508-Anforderungen prüfen… Bestanden! Installierte Paketsicherheit prüfen… Alles gut!

Fazit

Pipenv bringt Python-Verpackungen schließlich an die Spitze der modernen Softwareentwicklung. Es basiert auf anderen erfolgreichen Managementsystemen für Abhängigkeiten wie Rust's Cargo und Javascript's Yarn. 

Es vereint virtuelle Umgebungen und Paketverwaltung und bietet ein hervorragendes Erlebnis mit schönen und farbenfrohen Informationsnachrichten und impliziten Best Practices! Ich empfehle Ihnen dringend, Pipenv zur Verwaltung Ihrer Python-Projekte zu verwenden.

Zögern Sie nicht, zu sehen, was wir für den Verkauf und das Studium auf dem Envato-Markt zur Verfügung haben, und zögern Sie nicht, Fragen zu stellen und mit dem untenstehenden Feed wertvolles Feedback zu geben.