Revisiting Python Packaging With Pipenv

Översikt

Python är ett av de vänligaste men mest kraftfulla språken där ute. Det är lätt för nybörjare att plocka upp, men packar en stark slag och används i stor utsträckning i olika domäner som vetenskaplig programmering, webbprogrammering och DevOps. Men en av Pythons svagaste punkter har varit sitt stöd för att förpacka komplexa applikationer och deras beroende. 

Under åren har det gjorts många ansträngningar för att förbättra situationen. I augusti 2017 skrev jag en handledning om toppmodern i Python-förpackningar: hur man skriver, packar och distribuerar ett bibliotek i python. 

Det har varit bara fyra månader, och det finns en ny spelare i stan. Pipenv är nu det officiellt rekommenderade verktyget för förpackning av PyPA (Python Packaging Authority). I denna handledning lär du dig varför Pipenv förbättrar tillståndet för förpackningar och övergripande utvecklingsprocess för Python-utvecklare och hur de används effektivt.

Python Dev Workflow för människor

Målet med Pipenv är att förbättra utvecklingsarbetet för Python-utvecklare när det gäller hantering av beroenden och virtuella miljöer. Det är ett annat bra bibliotek från den industriella Kenneth Reitz, som är mest känd för begäran-paketet (HTTP för människor), men skrev några andra utmärkta paket. 

Behöver vi ännu ett förpackningsverktyg?

Ja det gör vi! Pipenv tar en sida från moderna pakethanteringsmetoder och importerar dem till Python-världen. 

Installera Pipenv

Du kan installera Pipenv med pip installera pipenv. Du får en fin produktion med emojis:

$ pip installera pipenv ✨🍰✨ 

Du måste göra det bara en gång. Om du inte har pip installerat kan du använda detta bootstrap-kommando: $ curl https://github.com/pypa/pipenv/blob/master/get-pipenv.py | pytonorm

Pipfile och Pipfile.lock

Pipenv kan skapa en tom virtuell miljö för dig. Här är en snabb demo: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv - three Output: Skapa en virtualenv för detta projekt ... Använda / usr / local / bin / python3 för att skapa virtualenv ... ⠋ Running virtualenv med tolk / usr / local / bin / python3 Använda basprefixet '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Ny python körbar i /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Skapa också körbar i /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installera setuptools, pip, wheel ... done. Virtualenv plats: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Skapa en pipefil för detta projekt ... 

Detta skapar en tom pipefil utan beroenden. Men eftersom du förmodligen vill installera några paket för ditt projekt, kan du bara använda pipenv för att installera ett paket och det kommer automatiskt att skapa den virtuella miljön. Till exempel:

~ / git / testpipenv> pipenv installeringsförfrågningar Utgång: Installera förfrågningar ... Samla förfrågningar Använda cachade förfrågningar-2.18.4-py2.py3-none-any.whl Samla idna<2.7,>= 2.5 (från förfrågningar) Använda cachad idna-2.6-py2.py3-none-any.whl Samla chardet<3.1.0,>= 3.0.2 (från förfrågningar) Använd cacherad chardet-3.0.4-py2.py3-none-any.whl Samla certifi> = 2017.4.17 (från förfrågningar) Använd cacherad certifi-2017.11.5-py2.py3-none- any.whl Samla urllib3<1.23,>= 1.21.1 (från förfrågningar) Använda cachade urllib3-1.22-py2.py3-none-any.whl Installera samlade paket: idna, chardet, certifi, urllib3, förfrågningar Installerat certifi-2017.11.5 chardet-3.0.4 idna- 2.6 förfrågningar-2.18.4 urllib3-1.22 Lägga till förfrågningar på Pipfile s [paket] ... PS: Du har utmärkt smak! ✨ 🍰 ✨ Låsning av [dev-paket] beroenden ... Låsning av [paket] beroenden ... Uppdaterat Pipfile.lock (7b8df8)! 

Nivån på detaljer är utmärkt, och den använder också trevliga färger. Här är den resulterande pipefilen:

[källa]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" [dev-paket] [paket] requests = "*" [kräver] python_version = "3.6" 

Pipfile håller reda på ditt projekts överordnade beroende - här, bara requests = "*". Den använder TOML som sitt format, vilket är ett populärt val för konfigurationsfiler (Rust's Cargo, Pythons PEP-518). 

Pipefile.lock-filen, å andra sidan, är en JSON-fil som specificerar vissa metadata och de exakta versionerna (inklusive hash) av alla rekursiva beroenden (toppnivåberoende och deras beroende). Här är filen Pipfile.lock:

"meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "värdmiljömarkörer": "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 Version 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, "kräver": "python_version": "3.6", "källor": ["name": "pypi", "url": "https: //pypi.python .org / simple "," verify_ssl ": true]," standard ": " certifi ": " 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": "== 2.6", "begär": "hashes": "sha256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "version": "== 2.18.4", "urllib3" ": [" sha256: 06330f38fd6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b "," sha256: cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f "]," version ":" == 1.22 "," utveckla ":  

Om du vill se en graf över alla dina beroende beror du på: pipenvgraf

~ / git / testpipenv> pipenv-diagramförfrågningar == 2.18.4 - certifi [krävs:> = 2017.4.17, installerad: 2017.11.5] - chardet [krävs:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2,5, installerad: 2.6] - urllib3 [krävs:> = 1.21.1,<1.23, installed: 1.22]

Använda installerade paket med Pipenv

När du har installerat ett paket med Pipenv, är det tillgängligt i din virtuella miljö precis som ett standardpaket (detsamma som om du installerade det). Den enda försiktigheten är att du måste använda din virtuella miljö tolk. Pipenv ger två hjälpsamma kommandon: springa och skal

Du använder pipenv kör python .py att köra ditt program, och du använder pipenv skal att starta ett nytt skal med din virtuella miljö Python tolk. Så här använder du kommandot Shell för att starta en interaktiv Python-session som använder installationspaketet för att få ett citat av dagen från ett REST API. Den virtuella miljön aktiveras och lanseringen Python använder rätt tolk var förfrågningar är tillgänglig.

~ / git / testpipenv> pipenv skal Spawning miljö skal (/ bin / bash). Använd "exit" för att lämna. Källa / Användare / 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 (standard, nov 19 2017, 16:39:12) [GCC 4.2.1 Kompatibel Apple LLVM 9.0.0 (clang-900.0.38)] på darwin Skriv "hjälp", "upphovsrätt", "krediter" eller "licens" för mer information. >>> importförfrågningar >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok Sann >>> r.json () 'success': 'total' : 1, "innehåll": 'citat': ['quote'): "Häng ut med människor som är bättre än du.", "Författare": "Warren Buffett", "längd" : 'inspirera', 'titel': 'Inspirerande citat av dagen', 'datum': '2018-01-03', ' id ': None],' copyright ':' 2017-19 theysaidso.com ' >>> citat = r.json () [' innehåll '] [' citat '] [0] [' citat ']> >> Författare = r.json () ['innehåll'] ['citat'] [0] ['Författare'] >>> Skriv ut (F 'citat ~~ Författare') Häng ut med Människor Vem är Bättre än dig. ~ ~ Warren Buffett >>>

Importerar från requirements.txt

Om du vill migrera ett befintligt projekt med requirements.txt har Pipenv fått dig täckt. Helt enkelt: pipenv installation -r .

Alla dina beroenden kommer att importeras till pipefilen. För att faktiskt installera beroenden och skapa Pipfile.lock behöver du pipenv installation. När du har verifierat att allt fungerar som förväntat, kan du radera din requirements.txt-fil.

Om din requirements.txt finns i samma katalog som du skapar den virtuella miljön genererar Pipenv automatiskt pipefilen. Men akta dig om att om din requirements.txt-fil innehöll spända versioner så kommer de att vara fastade i pipefilen också. I Pipenv-världen borde häftning hända i Pipfile.lock-filen. Pipenv kommer att ge en vänlig påminnelse. Se nedan:

~ / git / testpipenv> cat requirements.txt requests == 2.18.4 ~ / git / testpipenv> pipenv - three Skapa en virtualenv för detta projekt ... Använda / usr / local / bin / python3 för att skapa virtualenv ... ⠋ Running virtualenv med tolk / usr / local / bin / python3 Använda basprefix '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Ny python körbar i /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Skapa också körbar i /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installera setuptools, pip, wheel ... done. Virtualenv plats: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt hittades, istället för Pipfile! Konvertera ... Varning: Din pipefil innehåller nu spända versioner, om dina requirements.txt gjorde. Vi rekommenderar att du uppdaterar din pipefil för att ange versionen "*" istället. 

Här är den pinned versionen i pipefilen som rekommenderas att byta till "*":

[paket] requests = "== 2.18.4" 

Låt oss installera beroendet nu:

~ / git / testpipenv> pipenv installera Pipfile.lock inte hittat, skapa ... Låsa [dev-packages] beroenden ... Låsa [paket] beroenden ... Uppdaterat Pipfile.lock (0b0daf)! Installera beroenden från Pipfile.lock (0b0daf) ... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 För att aktivera projektets virtualenv, kör följande: $ pipenv shell ~ / git / testpipenv>

Redigerbara beroende

Du kan berätta för Pipenv att installera en sökväg som redigerbar. Det här är användbart när du är beroende av paket du utvecklar och vill bero på ditt källpaket utan att installera dem själva varje gång du gör en förändring. Det är särskilt användbart för den aktuella katalogen när du aktivt arbetar med den. För att göra det, använd -e och --dev flaggor:

> pipenv installera '-e.' --dev

Du måste ha en korrekt setup.py-fil.

Hantera din miljö med Pipenv

Du har redan sett mycket av vad Pipenv kan göra för dig. Låt oss gräva djupare in i några ytterligare kommandon och alternativ.

Installera paket

De pipenv installation Kommandot stöder flera alternativ:

  • --dev: Installera både utveckla och standardpaket från Pipfile.lock.
  • --systemet: Använd kommandot system pip istället för den från din virtualenv.
  • --ignorera-pipfile: Ignorera pipefilen och installera från Pipfile.lock.
  • --skip-lock: Ignorera Pipfile.lock och installera från Pipfile. Dessutom skriver du inte ut ett Pipfile.lock som reflekterar ändringar i pipefilen. 

Beroende på ditt arbetsflöde och inställningar kanske du vill använda ett eller flera av dessa alternativ vid olika tidpunkter.

Avinstallera paket

För att avinstallera ett beroende skriver du: avinstallera pipenv . Till exempel:

~ / git / testpipenv> Avinstallera förfrågningar om pipenv Uninstallera förfrågningar ... Avinstallera förfrågningar-2.18.4: Avinstallerade förfrågningar framgångsrikt-2.18.4 Ta bort förfrågningar från Pipfile ... Låsa [dev-packages] beroenden ... Låsa [paket] beroende ... Uppdaterad Pipfile. lås (625834)! 

Observera att jag inte behövde ange "förfrågningar == 2.8.14" vid avinstallation, även om det var fastat i pipefilen.

Låsningsberoende

Om du vill skapa en ögonblicksbild av dina nuvarande beroenden (t ex före en släpp), använd låskommandot. Detta är nyckeln till deterministiska och repeterbara byggnader: pipenv lås --pre.

Ta bort den virtuella miljön

Pipenv är fantastisk, men du kan städa upp några av dina virtuella miljöer från tid till annan. Det är lika enkelt som pipenv-rm.

säkerhet

Pipfile.lock utnyttjar några bra nya säkerhetsförbättringar i pip. Som standard genereras Pipfile.lock med sha256-hasharna i varje nedladdad paket. Detta gör det möjligt för pip att garantera att du installerar vad du tänker göra när du befinner dig på ett kompromissat nätverk eller nedladdar beroenden från ett otillförlitligt PyPI-ändpunkt.

Dessutom tillhandahåller Pipenv kontrollera kommando, som kontrollerar efterlevnaden av PEP 508 - Dependensspecifikation för Python Software Packages samt paketskydd:

~ / git / testpipenv> pipenv check. Kontrollera PEP 508 krav ... Passed! Kontrollera installerad säkerhetssäkerhet ... Allt bra!

Slutsats

Pipenv levererar äntligen Python-förpackningar till framkant av modern mjukvaruutveckling. Det tar inspiration från andra framgångsrika beroendehanteringssystem som Rust's Cargo och Javascript's Garn. 

Den gifter sig med virtuella miljöer och pakethantering och ger en överlägsen upplevelse med vackra och färgstarka informationsmeddelanden och implisitte bästa praxis! Jag rekommenderar starkt att du börjar använda Pipenv för att hantera dina Python-projekt.

Tveka inte heller att se vad vi har till salu och studera på Envato Market, och tveka inte att ställa några frågor och ge din värdefulla feedback genom att använda foderet nedan.