Python-verpakkingen opnieuw bezoeken met Pipenv

Overzicht

Python is een van de vriendelijkste en toch krachtigste talen die er zijn. Het is gemakkelijk voor beginners om op te pikken, maar pakt een sterke stoot en wordt veel gebruikt in diverse domeinen zoals wetenschappelijke programmering, programmering van webtoepassingen en DevOps. Maar een van de zwakste punten van Python is de ondersteuning voor het verpakken van complexe applicaties en hun afhankelijkheden. 

In de loop van de jaren zijn er veel inspanningen geweest om de situatie te verbeteren. In augustus 2017 schreef ik een tutorial over de stand van zaken in Python-verpakkingen: Hoe een bibliotheek in Python schrijven, verpakken en distribueren. 

Het is pas vier maanden geleden en er is een nieuwe speler in de stad. Pipenv is nu het officieel aanbevolen hulpmiddel voor verpakkingen door PyPA (Python Packaging Authority). In deze tutorial leer je waarom Pipenv de status van de verpakking en algehele ontwikkelworkflow voor Python-ontwikkelaars aanzienlijk verbetert en hoe deze effectief te gebruiken.

Python Dev Workflow voor mensen

Het doel van Pipenv is om de ontwikkelstroom van Python-ontwikkelaars te verbeteren als het gaat om het beheren van afhankelijkheden en virtuele omgevingen. Het is een andere fijne bibliotheek van de nijvere Kenneth Reitz, die vooral bekend is om het request-pakket (HTTP voor mensen), maar een paar andere uitstekende pakketten schreef. 

Do We Need Yet Another Packaging Tool?

Ja dat doen we! Pipenv neemt een pagina van moderne pakketbeheerpraktijken en importeert deze naar de Python-wereld. 

Installatie van Pipenv

Je kunt Pipenv installeren met pip install pipenv. Je krijgt een mooie uitvoer met emoji's:

$ pip install pipenv ✨🍰✨ 

Je zult het maar één keer moeten doen. Als je geen pip hebt geïnstalleerd, kun je deze bootstrap-opdracht gebruiken: $ krullen https://github.com/pypa/pipenv/blob/master/get-pipenv.py | Python

Pipfile en Pipfile.lock

Pipenv kan een lege virtuele omgeving voor u maken. Hier is een korte demo: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv --three Output: een virtualenv maken voor dit project ... / usr / local / bin / python3 gebruiken om virtualenv te maken ... ⠋ Virtualenv uitvoeren met interpreter / usr / local / bin / python3 Het basisprefix gebruiken '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Nieuw python-uitvoerbaar bestand in /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Ook uitvoerbaar maken in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installeren van setuptools, pip, wheel ... done. Virtualenv-locatie: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Een Pipfile maken voor dit project ... 

Hiermee wordt een leeg Pip-bestand zonder afhankelijkheden gemaakt. Maar aangezien u waarschijnlijk sommige pakketten voor uw project wilt installeren, kunt u pipenv gewoon gebruiken om een ​​pakket te installeren en het maakt de virtuele omgeving automatisch. Bijvoorbeeld:

~ / git / testpipenv> pipenv install requests Output: Installing requests ... Collecting requests using cached requests-2.18.4-py2.py3-none-any.whl Idna verzamelen<2.7,>= 2.5 (uit verzoeken) Gebruiken van cached idna-2.6-py2.py3-none-any.whl Verzamelen chardet<3.1.0,>= 3.0.2 (uit verzoeken) Gecachet chardet-3.0.4-py2.py3-none-any.whl gebruiken Verzamelen certifi> = 2017.4.17 (uit verzoeken) Gecertificeerd certificeren-2017.11.5-py2.py3-geen- any.whl Urllib3 verzamelen<1.23,>= 1.21.1 (uit verzoeken) Gebruik van cached urllib3-1.22-py2.py3-none-any.whl Installatie van verzamelde pakketten: idna, chardet, certifi, urllib3, requests Met succes geïnstalleerd certifi-2017.11.5 chardet-3.0.4 idna- 2.6 requests-2.18.4 urllib3-1.22 Toevoegen van verzoeken aan Pipfile's [packages] ... PS: Je hebt een uitstekende smaak! ✨ 🍰 ✨ [dev-packages] afhankelijkheden vergrendelen ... [afhankelijkheden van pakketten] vergrendelen ... Pipfile.lock bijgewerkt (7b8df8)! 

Het detailniveau is uitstekend en gebruikt ook mooie kleuren. Hier is het resulterende Pipfile:

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

Het Pipfile houdt de belangrijkste afhankelijkheden van uw project bij - hier, alleen requests = "*". Het gebruikt TOML als het formaat, wat tegenwoordig een populaire keuze is voor configuratiebestanden (Rust's Cargo, Python's PEP-518). 

Het bestand Pipefile.lock is daarentegen een JSON-bestand dat een aantal metadata en de exacte versies (inclusief hashes) van alle recursieve afhankelijkheden specificeert (afhankelijkheden op het hoogste niveau en hun afhankelijkheden). Hier is het bestand Pipfile.lock:

"_meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "host-environment-markers": "implementation_name": "cpython", "implementation_version": "3.6.3", "os_name" : "posix", "platform_machine": "x86_64", "platform_python_implementation": "CPython", "platform_release": "16.7.0", "platform_system": "Darwin", "platform_version": "Darwin Kernel versie 16.7.0 : Wo 4 oktober 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, "require": "python_version": "3.6", "sources": ["name": "pypi", "url": "https: //pypi.python .org / simple "," verify_ssl ": true]," default ": " certifi ": " hashes ": [" sha256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694 "," sha256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0 "]," version ":" == 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "sha256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "versie": "== 3.0.4", "iDNA":  "hashes": [ "sha256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "sha256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "version": "== 2.6", "requests": "hashes": ["sha256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "version": "== 2.18.4", "urllib3": "hashes ": [" sha256: 06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b "," sha256: cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f "]," version ":" == 1.22 "," develop ":  

Als je een grafiek van al je afhankelijkheden wilt zien, typ je: pipenv-grafiek

~ / git / testpipenv> pipenv graph-verzoeken == 2.18.4 - certifi [vereist:> = 2017.4.17, geïnstalleerd: 2017.11.5] - chardet [vereist:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2.5, geïnstalleerd: 2.6] - urllib3 [vereist:> = 1.21.1,<1.23, installed: 1.22]

Geïnstalleerde pakketten gebruiken met Pipenv

Zodra u een pakket met Pipenv hebt geïnstalleerd, is het toegankelijk in uw virtuele omgeving, net als een standaardpakket (hetzelfde als wanneer u het hebt geïnstalleerd). De enige voorzorgsmaatregel is dat u uw virtuele omgevingstolk moet gebruiken. Pipenv biedt twee nuttige opdrachten: rennen en schelp

Je gebruikt pipenv run python .py om je programma te draaien, en gebruik je pipenv-schaal om een ​​nieuwe shell te starten met uw virtuele omgeving Python-interpreter. Hier is hoe u de shell-opdracht gebruikt om een ​​interactieve Python-sessie te starten die het pakket met geïnstalleerde aanvragen gebruikt om een ​​quote van de dag te krijgen van een REST-API. De virtuele omgeving is geactiveerd en het starten van Python maakt gebruik van de juiste interpreter waar verzoeken is beschikbaar.

~ / git / testpipenv> pipenv shell Paaigebiedschil (/ bin / bash). Gebruik 'exit' om te verlaten. source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate ~ / git / testpipenv> source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate (testpipenv-0GShD6dy) ~ / git / testpipenv> python Python 3.6.3 (standaard, 19 november 2017, 16:39:12) [GCC 4.2.1 Compatibele Apple LLVM 9.0.0 (clang-900.0.38)] op darwin Typ "help", "copyright", "credits" of "licentie" voor meer informatie. >>> import-aanvragen >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok True >>> r.json () 'success': 'total' : 1, 'contents': 'quotes': ['quote': 'Hang uit met mensen die beter zijn dan jij.', 'Auteur': 'Warren Buffett', 'length': None, 'tags' : ['beterschap', 'inspireren', 'mensen'], 'categorie': 'inspireer', 'titel': 'Inspirerend citaat van de dag', 'datum': '2018-01-03', ' id ': Geen],' copyright ':' 2017-19 theysaidso.com ' >>> quote = r.json () [' inhoud '] [' citaten '] [0] [' quote ']> >> author = r.json () ['inhoud'] ['citaten'] [0] ['auteur'] >>> print (f 'quote ~~ auteur') Hang uit met mensen die zijn Beter dan jij. ~~ Warren Buffett >>>

Importeren vanuit requirements.txt

Als je een bestaand project met een requirements.txt wilt migreren, kun je bij Pipenv terecht. gewoon: pipenv install -r .

Al uw afhankelijkheden zullen in het Pip-bestand worden geïmporteerd. Om de afhankelijkheden te installeren en het Pipfile.lock te genereren, moet je dit doen pipenv installeren. Nadat u hebt gecontroleerd of alles naar behoren werkt, kunt u uw requirements.txt-bestand verwijderen.

Als uw requirements.txt bestaat in dezelfde map die u de virtuele omgeving aanmaakt, zal Pipenv automatisch het Pipfile genereren. Maar pas op dat als uw requirements.txt-bestand vastgezette versies bevatte, deze ook in de Pipfile worden vastgezet. In de Pipenv-wereld moet het pinning gebeuren in het bestand Pipfile.lock. Pipenv zal een vriendelijke herinnering geven. Zie hieronder:

~ / git / testpipenv> cat requirements.txt requests == 2.18.4 ~ / git / testpipenv> pipenv --three Een virtualenv maken voor dit project ... / usr / local / bin / python3 gebruiken om virtualenv te maken ... ⠋ Virtualenv draaien met interpreter / usr / local / bin / python3 Het basisprefix gebruiken '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Nieuw python-uitvoerbaar bestand in /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Ook uitvoerbaar maken in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installeren van setuptools, pip, wheel ... done. Virtualenv-locatie: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt gevonden, in plaats van Pipfile! Converteren ... Waarschuwing: uw Pipfile bevat nu vastgezette versies, als uw requirements.txt dat deed. We raden aan om uw Pipfile bij te werken om de "*" -versie te specificeren. 

Hier is de vastgezette versie in de Pipfile die wordt aanbevolen om te veranderen in "*":

[packages] requests = "== 2.18.4" 

Laten we de afhankelijkheden nu installeren:

~ / git / testpipenv> pipenv install Pipfile.lock niet gevonden, maken ... [dev-pakketten] afhankelijkheden vergrendelen ... [afhankelijkheden van pakketten] vergrendelen ... Pipfile.lock bijgewerkt (0b0daf)! Afhankelijkheden installeren vanuit Pipfile.lock (0b0daf) ... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 Om de virtualenv van dit project te activeren, voer je het volgende uit: $ pipenv shell ~ / git / testpipenv>

Bewerkbare afhankelijkheden

U kunt Pipenv vertellen dat een pad moet worden geïnstalleerd als bewerkbaar. Dit is handig als u afhankelijk bent van pakketten die u aan het ontwikkelen bent en afhankelijk wilt zijn van uw bronpakket zonder ze daadwerkelijk te installeren elke keer dat u een wijziging aanbrengt. In het bijzonder is het handig voor de huidige directory wanneer u er actief mee bezig bent. Gebruik hiervoor de -e en --dev vlaggen:

> pipenv install '-e.' --dev

U moet een goed setup.py-bestand hebben.

Uw omgeving beheren met Pipenv

Je hebt al veel gezien wat Pipenv voor je kan doen. Laten we dieper ingaan op enkele extra opdrachten en opties.

Pakketten installeren

De pipenv installeren commando ondersteunt verschillende opties:

  • --dev: Installeer zowel ontwikkel- als standaardpakketten vanuit Pipfile.lock.
  • --systeem: Gebruik de opdracht system pip in plaats van die van uw virtualenv.
  • --negeren-pipfile: Negeer de Pipfile en installeer vanuit het Pipfile.lock.
  • --skip-lock: Negeer het Pipfile.lock en installeer het vanuit de Pipfile. Schrijf bovendien geen Pipfile.lock op die wijzigingen in de Pipfile weergeeft. 

Afhankelijk van uw workflow en voorkeuren, wilt u misschien een of meer van deze opties op verschillende tijdstippen gebruiken.

Pakketten verwijderen

Om een ​​afhankelijkheid te verwijderen, typt u: pipenv verwijderen . Bijvoorbeeld:

~ / git / testpipenv> pipenv verwijderingsverzoeken aanvragen ongedaan maken van aanvragen ... aanvragen verwijderen-2.18.4: aanvragen verwijderd-2.18.4 aanvragen uit pipfile verwijderen ... [dev-pakketten] afhankelijkheden vergrendelen ... [afhankelijkheden van pakketten] vergrendelen ... bijgewerkte pipfile. slot (625834)! 

Merk op dat ik "requests == 2.8.14" niet hoefde op te geven bij het verwijderen, ook al was het vastgezet in de Pipfile.

Afhankelijkheden vergrendelen

Als u een momentopname van uw huidige afhankelijkheden wilt genereren (bijvoorbeeld vóór een release), gebruikt u de opdracht lock. Dit is de sleutel tot deterministische en herhaalbare builds: pipenv lock --pre.

De virtuele omgeving verwijderen

Pipenv is geweldig, maar je kunt sommige van je virtuele omgevingen van tijd tot tijd opruimen. Het is zo simpel als pipenv --rm.

Veiligheid

Pipfile.lock maakt gebruik van enkele geweldige nieuwe beveiligingsverbeteringen in pip. Standaard wordt het Pipfile.lock gegenereerd met de sha256 hashes van elk gedownload pakket. Hierdoor kan pip garanderen dat je installeert wat je van plan bent wanneer je in een aangetast netwerk zit of afhankelijkheden downloadt van een niet-vertrouwd PyPI-eindpunt.

Bovendien biedt Pipenv de controleren commando, dat controleert of PEP 508 - afhankelijkheidsspecificatie voor Python softwarepakketten en de veiligheid van het pakket voldoen:

~ / git / testpipenv> pipenv-check. PEP 508-vereisten controleren ... Doorgegeven! Geïnstalleerde pakketveiligheid controleren ... Allemaal goed!

Conclusie

Pipenv brengt eindelijk Python-verpakkingen naar de voorgrond in de moderne softwareontwikkeling. Het is geïnspireerd op andere succesvolle afhankelijkheidsbeheersystemen zoals Rust's Cargo en Javascript's Yarn. 

Het trouwt met virtuele omgevingen en pakketbeheer en biedt een superieure ervaring met prachtige en kleurrijke informatieve berichten en impliciete beste praktijken! Ik raad ten zeerste aan dat je Pipenv gaat gebruiken om je Python-projecten te beheren.

Aarzel ook niet om te zien wat we beschikbaar hebben voor de verkoop en om te studeren in de Envato-markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.