Revisiting Python Packaging With Pipenv

Oversikt

Python er et av de vennligste og mest kraftfulle språkene der ute. Det er lett for nybegynnere å plukke opp, men pakker en sterk slag og brukes mye i ulike domener som vitenskapelig programmering, webprogrammering og DevOps. Men en av de svakeste punktene i Python har vært sin støtte for å pakke komplekse applikasjoner og deres avhengigheter. 

Gjennom årene har det vært mange anstrengelser for å forbedre situasjonen. I august 2017 skrev jeg en opplæring om state of the art i Python-emballasje: Hvordan skrive, pakke og distribuere et bibliotek i Python. 

Det har bare vært fire måneder, og det er en ny spiller i byen. Pipenv er nå det offisielt anbefalte verktøyet til pakking av PyPA (Python Packaging Authority). I denne opplæringen lærer du hvorfor Pipenv forbedrer emballasjen og utviklingsprosessen for Python-utviklere og hvordan de skal brukes effektivt.

Python Dev arbeidsflyt for mennesker

Målet med Pipenv er å forbedre utviklingsarbeidet for Python-utviklere når det gjelder å håndtere avhengigheter og virtuelle miljøer. Det er et annet godt bibliotek fra den industrielle Kenneth Reitz, som er kjent for det meste for forespørselspakken (HTTP for mennesker), men skrev noen andre gode pakker. 

Trenger vi enda et pakkeverktøy?

Ja det gjør vi! Pipenv tar en side fra moderne pakkehåndteringspraksis og importerer dem til Python-verdenen. 

Installere Pipenv

Du kan installere Pipenv med pip installer pipenv. Du får en fin produksjon med emojis:

$ pip installer pipenv ✨🍰✨ 

Du må gjøre det bare en gang. Hvis du ikke har pip installert, kan du bruke denne bootstrap-kommandoen: $ krølle https://github.com/pypa/pipenv/blob/master/get-pipenv.py | python

Pipfile og Pipfile.lock

Pipenv kan skape et tomt virtuelt miljø for deg. Her er en rask demonstrasjon: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv - tre Output: Opprette en virtualenv for dette prosjektet ... Bruke / usr / local / bin / python3 å opprette virtualenv ... ⠋ Kjører virtualenv med tolk / usr / local / bin / python3 Bruke base prefix '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Ny python kjørbar i /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Lag også kjørbar i /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installering av setuptools, pip, hjul ... ferdig. Virtualenv sted: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Opprette en pipefil for dette prosjektet ... 

Dette vil opprette en tom pipefilter uten avhengighet. Men siden du sikkert vil installere noen pakker for prosjektet ditt, kan du bare bruke pipenv til å installere en pakke, og det vil automatisk opprette det virtuelle miljøet. For eksempel:

~ / git / testpipenv> pipenv installasjonsforespørsler Utdata: Installere forespørsler ... Samle forespørsler Bruke hurtigbufrede forespørsler-2.18.4-py2.py3-none-any.whl Samle idna<2.7,>= 2,5 (fra forespørsler) Bruke cached idna-2.6-py2.py3-none-any.whl Samle chardet<3.1.0,>= 3.0.2 (fra forespørsler) Bruke bufret chardet-3.0.4-py2.py3-none-any.whl Innsamle certifi> = 2017.4.17 (fra forespørsler) Bruke cached certifi-2017.11.5-py2.py3-none- any.whl Samle urllib3<1.23,>= 1.21.1 (fra forespørsler) Bruke cached urllib3-1.22-py2.py3-none-any.whl Installere samlepakker: idna, chardet, certifi, urllib3, forespørsler Installert vellykket certifi-2017.11.5 chardet-3.0.4 idna- 2.6 forespørsler-2.18.4 urllib3-1.22 Legge til forespørsler til Pipfile's [pakker] ... PS: Du har utmerket smak! ✨ 🍰 ✨ Låsing av [dev-pakker] avhengigheter ... Låsing av [pakker] avhengigheter ... Oppdatert Pipfile.lock (7b8df8)! 

Detaljnivået er utmerket, og det bruker fine farger også. Her er den resulterende pipefilen:

[kilden]] url = "https://pypi.python.org/simple" verify_ssl = sann navn = "pypi" [dev-pakker] [pakker] requests = "*" [krever] python_version = "3.6" 

Pipfile holder styr på prosjektets toppnivå avhengigheter-her, bare requests = "*". Den bruker TOML som format, som i dag er et populært valg for konfigurasjonsfiler (Rust's Cargo, Python's PEP-518). 

Pipefile.lock-filen, derimot, er en JSON-fil som spesifiserer noen metadata og de eksakte versjoner (inkludert hashes) av alle rekursive avhengigheter (toppnivåavhengigheter og deres avhengigheter). Her er Pipfile.lock-filen:

"meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "vertsmiljømarkører": "implementation_name": "cpython", "implementation_version": "3.6.3", "os_name" : "platform_machine": "platform_machine": "x86_64", "platform_python_implementation": "CPython", "platform_release": "16.7.0", "platform_system": "Darwin", "platform_version": "Darwin Kernel Versjon 16.7.0 : Ons 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, "krever": "python_version": "3.6", "kilder": ["navn": "pypi", "url": "https: //pypi.python Org / enkle " "verify_ssl": true], "default":  "certifi":  "hash": [ "SHA256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", "SHA256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0"] " versjon":" == 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "SHA256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "versjon": "== 3.0.4", "Idna":  "hasher": [ "SHA256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "SHA256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "Versjon": "== 2.6", "forespørsler": "hashes": "sha256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "versjon": "== 2.18.4", "urllib3": "hashes ": [" sha256: 06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b "," sha256: cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f "]," versjon ":" == 1,22 "," utvikle ":  

Hvis du vil se en graf over alle dine avhengigheter, skriver du: pipenv-grafen

~ / git / testpipenv> pipenv grafer forespørsler == 2.18.4 - certifi [påkrevd:> = 2017.4.17, installert: 2017.11.5] - chardet [påkrevd:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2,5, installert: 2.6] - urllib3 [påkrevd:> = 1.21.1,<1.23, installed: 1.22]

Bruke installerte pakker med Pipenv

Når du har installert en pakke med Pipenv, er den tilgjengelig i ditt virtuelle miljø, akkurat som en standardpakke (det samme som om du pip installerte den). Den eneste forholdsregel er at du må bruke din virtuelle miljø tolk. Pipenv gir to nyttige kommandoer: løpe og shell

Du bruker pipenv kjøre python .py å kjøre programmet, og du bruker pipenv skall å starte et nytt skall med ditt virtuelle miljø Python tolk. Slik bruker du shell-kommandoen til å starte en interaktiv Python-økt som bruker installasjonspakken for å få et tilbud på dagen fra en REST-API. Det virtuelle miljøet er aktivert, og lanseringen av Python bruker riktig tolk der forespørsler er tilgjengelig.

~ / git / testpipenv> pipenv shell Spawning miljø shell (/ bin / bash). Bruk 'exit' for å forlate. kilde / brukere / gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate ~ / git / testpipenv> kilde / brukere / gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate (testpipenv-0GShD6dy) ~ / git / testpipenv> python Python 3.6.3 (standard, 19. november 2017, 16:39:12) [GCC 4.2.1 Kompatibel Apple LLVM 9.0.0 (clang-900.0.38)] på darwin Skriv "hjelp", "opphavsrett", "studiepoeng" eller "lisens" for mer informasjon. >>> importforespørsler >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok True >>> r.json () 'suksess': 'total' : 1, 'innhold': 'sitater': ['quote'): «Hang out med folk som er bedre enn deg.», «Forfatter»: 'Warren Buffett', 'lengde' : 'inspirere', 'tittel': 'Inspirerende sitat av dagen', 'dato': '2018-01-03', ' id ': Ingen],' copyright ':' 2017-19 theysaidso.com ' >>> sitat = r.json () [' innhold '] [' sitater '] [0] [' sitat ']> >> forfatter = r.json () ['innhold'] ['sitater'] [0] ['forfatter'] >>> print (f 'quote ~~ author') Hang out med folk som er Bedre enn deg. ~ ~ Warren Buffett >>>

Importerer fra requirements.txt

Hvis du vil migrere et eksisterende prosjekt med requirements.txt, har Pipenv fått deg dekket. Ganske enkelt: pipenv installasjon -r .

Alle dine avhengigheter vil bli importert til pipefilen. For å installere avhengighetene og generere Pipfile.lock, må du pipenv installasjon. Når du har bekreftet at alt fungerer som forventet, kan du slette din requirements.txt-fil.

Hvis dine requirements.txt eksisterer i samme katalog som du lager det virtuelle miljøet, vil Pipenv automatisk generere pipefilen. Men vær oppmerksom på at hvis din requirements.txt-fil inneholdt pinned-versjoner, blir de også festet i pipefilen. I Pipenv-verdenen bør pinning skje i Pipfile.lock-filen. Pipenv vil gi en vennlig påminnelse. Se nedenfor:

~ / git / testpipenv> cat requirements.txt requests == 2.18.4 ~ / git / testpipenv> pipenv - tre Opprette en virtualenv for dette prosjektet ... Bruke / usr / local / bin / python3 å opprette virtualenv ... ⠋ Kjører virtualenv med tolk / usr / lokal / bin / python3 Bruke base prefix '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Ny python kjørbar i /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Opprett også kjørbar i /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installere setuptools, pip, hjul ... ferdig. Virtualenv plassering: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt funnet, i stedet for Pipfile! Konvertering ... Advarsel: Pipefilen inneholder nå pinnede versjoner, hvis dine krav.txt gjorde. Vi anbefaler at du oppdaterer pipefilen for å angi versjonen *, i stedet. 

Her er den pinnede versjonen i pipefilen som anbefales å bytte til "*":

[pakker] requests = "== 2.18.4" 

La oss installere avhengighetene nå:

~ / git / testpipenv> pipenv installasjon Pipfile.lock ikke funnet, oppretter ... Låsing av [dev-pakker] avhengigheter ... Låsing av [pakker] avhengigheter ... Oppdatert Pipfile.lock (0b0daf)! Installere avhengigheter fra Pipfile.lock (0b0daf) ... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 For å aktivere dette prosjektets virtualenv, kjør følgende: $ pipenv shell ~ / git / testpipenv>

Redigerbare avhengigheter

Du kan fortelle Pipenv å installere en bane som redigerbar. Dette er nyttig når du er avhengig av pakker du utvikler og vil stole på kildepakken uten å installere dem hver gang du gjør en endring. Spesielt er det nyttig for gjeldende katalog når du arbeider aktivt med det. For å gjøre det, bruk -e og --dev flagg:

> pipenv installere '-e.' --dev

Du må ha en riktig setup.py-fil.

Administrere miljøet ditt med Pipenv

Du har allerede sett mye av hva Pipenv kan gjøre for deg. La oss grave dypere inn i noen ekstra kommandoer og alternativer.

Installere pakker

De pipenv installasjon kommandoen støtter flere alternativer:

  • --dev: Installer både utviklings- og standardpakker fra Pipfile.lock.
  • --system: Bruk system pip kommandoen i stedet for den fra virtualenv.
  • --ignorere-pipfile: Ignorer pipefilen og installer fra Pipfile.lock.
  • --hopp-lock: Ignorer Pipfile.lock og installer fra Pipfile. I tillegg må du ikke skrive ut en Pipfile.lock som reflekterer endringer i pipefilen. 

Avhengig av arbeidsflyten og innstillingene, kan du bruke en eller flere av disse alternativene på forskjellige tidspunkter.

Avinstallerer pakker

For å avinstallere en avhengighet, skriv inn: avinstallere pipenv . For eksempel:

~ / git / testpipenv> forespørsler om avinstallering av pipenv Un-installering av forespørsler ... Avinstallering av forespørsler-2.18.4: Avslutt forespørsler på vellykket måte-2.18.4 Fjerne forespørsler fra Pipfile ... Låsing av [dev-packages] avhengigheter ... Låsing av [pakker] avhengigheter ... Oppdatert Pipfile. lås (625834)! 

Vær oppmerksom på at jeg ikke måtte spesifisere "forespørsler == 2.8.14" når du avinstallerte, selv om den var festet i pipefilen.

Låseavhengighet

Hvis du vil generere et øyeblikksbilde av dine nåværende avhengigheter (for eksempel før en utgivelse), bruk låsekommandoen. Dette er nøkkelen til deterministiske og repeterbare bygg: pipenv lås --pre.

Fjerne det virtuelle miljøet

Pipenv er kjempebra, men du kan rydde opp noen av dine virtuelle miljøer fra tid til annen. Det er så enkelt som pipenv - rm.

Sikkerhet

Pipfile.lock utnytter noen flotte nye sikkerhetsforbedringer i pip. Som standard blir Pipfile.lock generert med sha256-hashene i hver nedlastet pakke. Dette vil tillate pip å garantere at du installerer hva du har tenkt å når du er på et kompromittert nettverk eller laster ned avhengigheter fra et usikkert PyPI-endepunkt.

I tillegg gir Pipenv kryss av kommando, som kontrollerer etterlevelse av PEP 508 - Dependensspesifikasjon for Python-programvarepakker samt pakkesikkerhet:

~ / git / testpipenv> pipenv sjekk. Kontrollerer PEP 508 krav ... Passed! Kontrollerer installert pakkesikkerhet ... Alt bra!

Konklusjon

Pipenv bringer endelig Python-emballasje til forkant med moderne programvareutvikling. Det tar inspirasjon fra andre vellykkede avhengighetsstyringssystemer som Rust's Cargo og Javascript's Garn. 

Den gifter seg med virtuelle miljøer og pakkeadministrasjon og gir en overlegen opplevelse med flotte og fargerike informasjonsmeldinger, og implisitte beste praksis! Jeg anbefaler at du begynner å bruke Pipenv til å administrere Python-prosjektene.

Ikke nøl med å se hva vi har tilgjengelig for salg og for studier i Envato Market, og ikke nøl med å stille spørsmål og gi din verdifulle tilbakemelding ved å bruke feedet under.