Revizuirea Python Packaging cu Pipenv

Prezentare generală

Python este una dintre cele mai prietenoase și totuși cele mai puternice limbi. Este ușor pentru începători de a ridica, dar împachetează un pumn puternic și este folosit pe scară largă în diverse domenii, cum ar fi programarea științifică, programarea aplicațiilor web și DevOps. Dar unul dintre cele mai slabe puncte ale Python-ului a fost sprijinul pentru ambalarea aplicațiilor complexe și dependențele acestora. 

De-a lungul anilor, s-au depus multe eforturi pentru îmbunătățirea situației. În august 2017, am scris un tutorial despre stadiul actual al tehnicii de ambalare în Python: Cum să scrieți, să împachetați și să distribuiți o bibliotecă în Python. 

Au trecut doar patru luni și există un nou jucător în oraș. Pipenv este acum instrumentul oficial recomandat pentru ambalarea de către PyPA (Python Packaging Authority). În acest tutorial veți afla de ce Pipenv îmbunătățește în mod semnificativ starea ambalării și fluxul general de lucru pentru dezvoltatorii Python și cum să îl utilizați în mod eficient.

Python Dev Workflow pentru oameni

Scopul Pipenv este de a îmbunătăți fluxul de lucru al dezvoltatorilor dezvoltatorilor Python atunci când vine vorba de gestionarea dependențelor și a mediilor virtuale. Este o altă bibliotecă bună de la Kenneth Reitz, care este cunoscut mai ales pentru pachetul de solicitări (HTTP pentru oameni), dar a scris și alte câteva pachete excelente. 

Avem nevoie încă de un alt instrument de ambalare?

Da facem! Pipenv ia o pagină din practicile moderne de gestionare a pachetelor și le importă în lumea Python. 

Instalarea programului Pipenv

Puteți instala Pipenv cu pip instalați pipenv. Veți obține o ieșire plăcută cu emojis:

$ pip instalați pipenv ✨🍰✨ 

Va trebui să o faci o singură dată. Dacă nu aveți instalat pip, puteți folosi această comandă bootstrap: $ curl https://github.com/pypa/pipenv/blob/master/get-pipenv.py | piton

Pipfile și Pipfile.lock

Pipenv poate crea un mediu virtual gol pentru tine. Iată o demonstrație rapidă: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv -three Output: Crearea unui virtualenv pentru acest proiect ... Folosind / usr / local / bin / python3 pentru a crea virtualenv ... Running virtual with interpreter / usr / local / bin / python3 Folosind prefixul de bază '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Noua executabilă python în /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 De asemenea, crearea executabil în / Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Instalarea setuptools, pip, roată ... făcut. Virtualenv locație: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Crearea unui fișier Piphile pentru acest proiect ... 

Acest lucru va crea un Pipfile gol fără dependențe. Dar, deoarece probabil veți dori să instalați unele pachete pentru proiectul dvs., puteți folosi doar pipenv pentru a instala un pachet și va crea automat mediul virtual. De exemplu:

~ / git / testpipenv> cererile de instalare pipenv Ieșire: Instalarea cererilor ... Colectarea cererilor Utilizarea cererilor memorate în cache-2.18.4-py2.py3-none-any.whl Colectarea idna<2.7,>= 2.5 (din cereri) Folosind idna-2.6-py2.py3-none-any.whl cached Collecting chardet<3.1.0,>= 3.0.2 (din cereri) Utilizarea cache-ului chardet-3.0.4-py2.py3-none-any.whl Colectarea certificfi> = 2017.4.17 (din cereri) Utilizarea certificatelor cache-2017.11.5-py2.py3- orice.whl Colectarea urllib3<1.23,>= 1.21.1 (din cereri) Utilizarea cache-ului urllib3-1.22-py2.py3-none-any.whl Instalarea pachetelor colectate: idna, chardet, certificfi, urllib3, 2.6 cereri-2.18.4 urllib3-1.22 Adăugarea de cereri către pachetele Pipfile ... PS: Aveți un gust excelent! ✨ 🍰 ✨ Blocarea dependențelor [dev-packages] ... Blocarea dependențelor [pachetelor] ... Actualizat Pipfile.lock (7b8df8)! 

Nivelul de detaliu este excelent și utilizează și culori frumoase. Aici este rezultatul Pipfile:

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

Pipfilul ține evidența dependențelor de nivel superior ale proiectului dvs. - aici, doar cererile = "*". Folosește TOML ca format, care este o alegere populară în aceste zile pentru fișierele de configurare (Rust's Cargo, Python's PEP-518). 

Fișierul Pipefile.lock, pe de altă parte, este un fișier JSON care specifică anumite metadate și versiunile exacte (inclusiv hashes) ale tuturor dependențelor recursive (dependențele de nivel superior și dependențele acestora). Aici este fișierul Pipfile.lock:

"_meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "host-environment-markers" "platform_machine": "x86_64", "platform_python_implementation": "CPython", "platform_release": "16.7.0", "platform_system": "Darwin Kernel Version 16.7.0 : "3.6.1", "python_version": "3.6", "sys_platform": "darwin" , "pipfile-spec": 6, "necesită": "python_version": "3.6", "sources": "pypi", "url": https: //pypi.python .org / simple "," verify_ssl ": true]," implicit ": " certificate ": " hashes ": [" sha256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694 "," sha256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0 "] 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "SHA256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "versiune": "== 3.0.4", "IDNA":  ":" hash [ "SHA256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "SHA256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "versiune": "== 2.6", "cereri":  ":" hash [ "SHA256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "SHA256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "versiune": "== 2.18.4", "urllib3":  „hashes "[" sha256: 06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b "," sha256: cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f "]," version ":" == 1.22 " 

Dacă doriți să vedeți un grafic al tuturor dependențelor, tastați: pipenv graf

~ / git / testpipenv> cerințele pentru pipenv grafice == 2.18.4 - certificfi [cerut:> = 2017.4.17, instalat: 2017.11.5] - chardet [obligatoriu:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2.5, instalat: 2.6] - urllib3 [necesar:> = 1.21.1,<1.23, installed: 1.22]

Utilizarea pachetelor instalate cu Pipenv

Odată ce ați instalat un pachet cu Pipenv, acesta este accesibil în mediul dvs. virtual, la fel ca un pachet standard (la fel ca în cazul în care îl instalați). Singura precauție este că trebuie să utilizați interpretul de mediu virtual. Pipenv oferă două comenzi utile: alerga și coajă

Să utilizați pipenv rulați python .py pentru a rula programul și utilizați pipenv shell pentru a începe o nouă shell cu interpretul dvs. Python pentru mediul virtual. Iată cum să utilizați comanda shell pentru a începe o sesiune interactivă Python care folosește pachetul de cereri instalate pentru a obține o cotație a zilei dintr-un API REST. Mediul virtual este activat, iar lansarea Python folosește interpretul potrivit cereri este disponibil.

~ / git / testpipenv> shell-ul pipenv Învelișul mediu de reproducere (/ bin / bash). Utilizați "ieșire" pentru a pleca. sursă /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate ~ / git / testpipenv> sursă /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate (testpipenv-0GShD6dy) ~ / git / testpipenv> python Python 3.6.3 (implicit, 19 noiembrie 2017, 16:39:12) [GCC 4.2.1 Compatibil Apple LLVM 9.0.0 (clang-900.0.38) Introduceți "ajutor", "drepturi de autor", "credite" sau "licență" pentru mai multe informații. >>> cererile de import >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok Adevărat >>> r.json () 'succes': 'total' : "", "Conținut": 'quotes': ['citat': ' : "inspira", "titlu": "inspirația citată a zilei", "data": "2018-01-03", " id: Nici unul], "copyright": '2017-19 theysaidso.com' >>> quote = r.json () ['content'] ['quotes'] [0] [quote] >> autor = r.json () ['content'] ['citate'] [0] ['autor'] >>> print (f 'quote ~~ author') Mai bine decât tine. ~~ Warren Buffett >>>

Importarea din requirements.txt

Dacă doriți să migrați un proiect existent cu cerințele requirements.txt, Pipenv v-a acoperit. Pur şi simplu: pipenv install -r .

Toate dependențele tale vor fi importate în Pip. Pentru a instala efectiv dependențele și a genera Pipfile.lock, trebuie să instalare pipenv. După ce ați verificat că totul funcționează conform așteptărilor, puteți șterge fișierul cu cerințe.txt.

Dacă cerințele dvs..txt există în același director pe care îl creați mediul virtual, atunci Pipenv va genera automat fișierul Pipfile. Dar feriți-vă că dacă fișierul dvs. requirements.txt conține versiuni fixate, atunci ele vor fi fixate și în Pipfile. În lumea Pipenv, fixarea ar trebui să se întâmple în fișierul Pipfile.lock. Pipenv va da un memento prietenos. Vezi mai jos:

~ / git / testpipenv> cererile de pisici request.txt == 2.18.4 ~ / git / testpipenv> pipenv --three Crearea unui virtualenv pentru acest proiect ... Folosind / usr / local / bin / python3 pentru a crea virtualenv ... interpreter / usr / local / bin / python3 Folosind prefixul de bază "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6" Executabil nou executabil în /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 De asemenea, crează executabil în /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Instalarea instrumentelor de configurare, pip, roată ... făcut. Virtualenv locație: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt găsit, în loc de Pipfile! Conversie ... Avertisment: Pip-ul dvs. conține acum versiuni fixate, dacă cerințele dvs..txt au făcut. Vă recomandăm să vă actualizați Pipfilul pentru a specifica versiunea "*". 

Aici este versiunea fixată în fișierul Pipfile care este recomandat să se schimbe în "*":

[packages] requests = "== 2.18.4" 

Să instalăm dependențele acum:

~ / git / testpipenv> instalarea pipenv Pipfile.lock nu a fost găsit, creând ... Blocarea dependențelor [dev-packages] ... Blocarea [pachetelor] dependențe ... Actualizat Pipfile.lock (0b0daf)! Instalarea dependențelor de la Pipfile.lock (0b0daf) ... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 Pentru a activa virtualenv-ul acestui proiect, executați următoarele: $ pipenv shell ~ / git / testpipenv>

Edificabile dependențe

Puteți să-i spuneți lui Pipenv să instaleze o cale editabilă. Acest lucru este util atunci când depindeți de pachetele pe care le dezvoltați și doriți să depindeți de pachetul sursă, fără să le instalați de fiecare dată când faceți o schimbare. În special, este util pentru directorul curent atunci când lucrați activ în el. Pentru a face acest lucru, utilizați -e și --dev steaguri:

> instalare pipenv '-e.' --dev

Trebuie să aveți un fișier setup.py corespunzător.

Gestionarea mediul dvs. cu Pipenv

Ați văzut deja multe din ceea ce poate face Pipenv pentru dvs. Să săpăm mai adânc niște comenzi și opțiuni suplimentare.

Instalarea pachetelor

instalare pipenv comanda acceptă mai multe opțiuni:

  • --dev: Instalați ambele pachete de dezvoltare și implicite din Pipfile.lock.
  • --sistem: Folosiți mai degrabă comanda sistemului pip decât cea din virtuale.
  • --ignora-pipfile: Ignorați fișierul Pipfile și instalați-l din Pipfile.lock.
  • --skip-blocare: Ignorați fișierul Pipfile.lock și instalați-l din fișierul Pipfile. În plus, nu scrie un Pipfile.lock care să reflecte modificările aduse fișierului Pipfile. 

În funcție de fluxul de lucru și de preferințele dvs., vă recomandăm să utilizați una sau mai multe dintre aceste opțiuni în momente diferite.

Dezinstalarea pachetelor

Pentru a dezinstala o dependență, tastați: pipenv dezinstalați . De exemplu:

~ / git / testpipenv> cereri de dezinstalare pipenv Solicitări de dezinstalare ... Dezinstalarea cererilor-2.18.4: Dezinstalarea cu succes a cererilor-2.18.4 Eliminarea cererilor din Pipfile ... Blocarea dependențelor [dev-packages] ... Blocarea dependențelor [pachetelor] ... Actualizat Pipfile. blocare (625834)! 

Rețineți că nu am fost nevoit să specific "cererile == 2.8.14" când dezinstalați, chiar dacă a fost fixat în fișierul Pip.

Blocarea dependențelor

Dacă doriți să generați un instantaneu al dependențelor dvs. curente (de exemplu, înainte de lansare), utilizați comanda de blocare. Aceasta este cheia construirii deterministe și repetabile: pipenv lock --pre.

Eliminarea mediului virtual

Pipenv este minunat, dar vă puteți curăța unele dintre mediile virtuale din când în când. Este la fel de simplu ca pipenv -rm.

Securitate

Pipfile.lock profită de câteva îmbunătățiri de securitate noi în pip. În mod implicit, Pipfile.lock va fi generat cu hashes-urile sha256 ale fiecărui pachet descărcat. Acest lucru va permite companiei pip să garanteze că instalați ceea ce intenționați atunci când vă aflați într-o rețea compromisă sau descărcați dependențe dintr-un punct final PyPI.

În plus, Pipenv furnizează Verifica care verifică conformitatea cu PEP 508 - specificația dependenței pentru Python Software Packages, precum și siguranța pachetelor:

~ / git / testpipenv> verificarea pipenv. Verificarea cerințelor PEP 508 ... A trecut! Verificarea siguranței pachetului instalat ... Bine!

Concluzie

În sfârșit, Pipenv aduce pachetul Python în fruntea dezvoltării software moderne. Se inspiră de la alte sisteme de succes de gestionare a dependenței, cum ar fi Rust's Cargo și Javascript's Fire. 

Se căsătorește cu mediile virtuale și gestionarea pachetelor și oferă o experiență superioară cu mesaje informative frumoase și pline de culoare și cu cele mai bune practici implicite! Vă recomandăm foarte mult să începeți să utilizați Pipenv pentru a vă gestiona proiectele Python.

În plus, nu ezitați să vedeți ceea ce avem la dispoziție pentru vânzare și pentru studierea pe piața Envato și nu ezitați să adresați întrebări și să oferiți feedback-ul dvs. valoros utilizând feedul de mai jos.

Cod