Rivisitare Python Packaging con Pipenv

Panoramica

Python è una delle lingue più amichevoli e più potenti in circolazione. È facile da imparare per i principianti, ma offre un forte impatto e viene ampiamente utilizzato in diversi ambiti come la programmazione scientifica, la programmazione di applicazioni Web e DevOps. Ma uno dei punti più deboli di Python è stato il supporto per il packaging di applicazioni complesse e le loro dipendenze. 

Nel corso degli anni, ci sono stati molti sforzi per migliorare la situazione. Nell'agosto 2017, ho scritto un tutorial sullo stato dell'arte nel packaging Python: Come scrivere, creare pacchetti e distribuire una libreria in Python. 

Sono passati solo quattro mesi e c'è un nuovo giocatore in città. Pipenv è ora lo strumento ufficialmente raccomandato per il packaging da PyPA (Python Packaging Authority). In questo tutorial imparerai perché Pipenv migliora in modo significativo lo stato della confezione e il flusso di lavoro di sviluppo generale per gli sviluppatori Python e come utilizzarlo in modo efficace.

Python Dev Workflow for Humans

L'obiettivo di Pipenv è migliorare il flusso di lavoro di sviluppo degli sviluppatori Python quando si tratta di gestire le dipendenze e gli ambienti virtuali. È un'altra eccellente libreria dell'operoso Kenneth Reitz, che è conosciuto soprattutto per il pacchetto di richieste (HTTP per umani), ma ha scritto alcuni altri pacchetti eccellenti. 

Abbiamo bisogno ancora di un altro strumento di packaging?

Sì, lo facciamo! Pipenv prende una pagina dalle moderne pratiche di gestione dei pacchetti e li importa nel mondo Python. 

Installare Pipenv

È possibile installare Pipenv con pip installa pipenv. Otterrai un buon risultato con le emoji:

$ pip installa pipenv ✨🍰✨ 

Dovrai farlo solo una volta. Se non hai installato pip, puoi utilizzare questo comando di bootstrap: $ arricciare https://github.com/pypa/pipenv/blob/master/get-pipenv.py | pitone

Pipfile e Pipfile.lock

Pipenv può creare un ambiente virtuale vuoto per te. Ecco una breve demo: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv --three Output: creazione di un virtualenv per questo progetto ... Utilizzando / usr / local / bin / python3 per creare virtualenv ... ⠋ Esecuzione virtualenv con interprete / usr / local / bin / python3 Usando il prefisso di base '/usr/local/Cellar/python3/3.6.3/Framework/Python.framework/Versions/3.6' Nuovo eseguibile python in /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Creazione anche eseguibile in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installazione di setuptools, pip, wheel ... terminato. Posizione Virtualenv: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Creazione di un Pipfile per questo progetto ... 

Questo creerà un Pipfile vuoto senza dipendenze. Ma poiché probabilmente vorrai installare alcuni pacchetti per il tuo progetto, puoi semplicemente usare pipenv per installare un pacchetto e creerà automaticamente l'ambiente virtuale. Per esempio:

~ / git / testpipenv> richieste di installazione pipenv Output: installazione delle richieste ... Raccolta delle richieste Utilizzo delle richieste memorizzate nella cache-2.18.4-py2.py3-none-any.whl Raccolta dell'idna<2.7,>= 2.5 (dalle richieste) Utilizzo di cache idna-2.6-py2.py3-none-any.whl Raccolta chardet<3.1.0,>= 3.0.2 (dalle richieste) Utilizzo di cache chardet-3.0.4-py2.py3-none-any.whl Raccolta di certificati> = 2017.4.17 (dalle richieste) Utilizzo di certificati certifi-2017.11.5-py2.py3-none- any.whl Raccolta di urllib3<1.23,>= 1.21.1 (dalle richieste) Uso di urllib3-1.22-py2.py3-none-any.whl nella cache Installazione dei pacchetti raccolti: idna, chardet, certifi, urllib3, richieste Installato correttamente certifi-2017.11.5 chardet-3.0.4 idna- 2.6 richieste-2.18.4 urllib3-1.22 Aggiunta di richieste ai [pacchetti] di Pipfile ... PS: Hai un gusto eccellente! ✨ 🍰 ✨ Bloccare le dipendenze [dev-packages] ... Bloccare [pacchetti] dipendenze ... Aggiornamento Pipfile.lock (7b8df8)! 

Il livello di dettaglio è eccellente e utilizza anche colori piacevoli. Ecco il file Pip risultante:

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

Pipfile tiene traccia delle dipendenze di primo livello del tuo progetto, qui, semplicemente requests = "*". Usa TOML come formato, che è una scelta popolare in questi giorni per i file di configurazione (Rust's Cargo, Python's PEP-518). 

Il file Pipefile.lock, d'altra parte, è un file JSON che specifica alcuni metadati e le esatte versioni (inclusi gli hash) di tutte le dipendenze ricorsive (dipendenze di primo livello e relative dipendenze). Ecco il file Pipfile.lock:

"_meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8", "parametri-host-ambiente": "nome_produzione": "cpython", "versione_produzione": "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 versione 16.7.0 : Wed 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, "requires": "python_version": "3.6", "sources": ["name": "pypi", "url": "https: //pypi.python .org / simple "," verify_ssl ": true]," default ": " certifi ": " hashes ": [" sha256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694 "," sha256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0 "]," versione ":" == 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "sha256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "versione": "== 3.0.4", "idna":  "hash": [ "sha256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "sha256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "versione": "== 2.6", "richieste": "hashes": ["sha256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "versione": "== 2.18.4", "urllib3": "hash ": [" sha256: 06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b "," sha256: cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f "]," versione ":" == 1.22 "," sviluppo ":  

Se vuoi vedere un grafico di tutte le tue dipendenze, digita: grafico pipenv

~ / git / testpipenv> richieste di grafi di pipen == 2.18.4 - certifi [richiesto:> = 2017.4.17, installato: 2017.11.5] - chardet [richiesto:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2.5, installato: 2.6] - urllib3 [richiesto:> = 1.21.1,<1.23, installed: 1.22]

Utilizzo dei pacchetti installati con Pipenv

Una volta installato un pacchetto con Pipenv, è accessibile nel tuo ambiente virtuale proprio come un pacchetto standard (lo stesso che se lo hai installato sul pip). L'unica precauzione è che devi usare l'interprete dell'ambiente virtuale. Pipenv fornisce due utili comandi: correre e conchiglia

Usate pipenv esegue python .py per eseguire il tuo programma e usi shell pipenv per avviare una nuova shell con l'ambiente virtuale interprete Python. Ecco come utilizzare il comando shell per avviare una sessione Python interattiva che utilizza il pacchetto di richieste installate per ottenere un preventivo del giorno da un'API REST. L'ambiente virtuale è attivato e il lancio di Python utilizza l'interprete giusto dove richieste è disponibile.

~ / git / testpipenv> shell di ambiente di spawn shell di pipenv (/ bin / bash). Usa "esci" per uscire. 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 (predefinito, Nov 19 2017, 16:39:12) [GCC 4.2.1 Compatibile Apple LLVM 9.0.0 (clang-900.0.38)] su darwin Digitare "help", "copyright", "credits" o "license" per ulteriori informazioni. >>> richieste di importazione >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok True >>> r.json () 'success': 'total' : 1, 'contents': 'quotes': ['quote': 'Hang Out con le persone che sono meglio di te.', 'Autore': 'Warren Buffett', 'length': None, 'tags' : ['getting-better', 'inspire', 'people'], 'category': 'inspire', 'title': 'Inspiring Quote of the day', 'date': '2018-01-03', ' id ': None],' copyright ':' 2017-19 theysaidso.com ' >>> quote = r.json () [' contents '] [' quotes '] [0] [' quote ']> >> author = r.json () ['contents'] ['quotes'] [0] ['author'] >>> print (f 'quote ~~ author') Hang Out con persone che sono Meglio di te. ~~ Warren Buffett >>>

Importazione da requirements.txt

Se vuoi migrare un progetto esistente con un requirements.txt, Pipenv ti ha coperto. Semplicemente: installazione pipenv -r .

Tutte le tue dipendenze verranno importate nel Pipfile. Per installare effettivamente le dipendenze e generare il Pipfile.lock, è necessario installazione di pipenv. Dopo aver verificato che tutto funzioni come previsto, puoi eliminare il tuo file requirements.txt.

Se your.txt esiste nella stessa directory in cui crei l'ambiente virtuale, Pipenv genererà automaticamente il Pipfile. Ma attenzione che se il tuo file requirements.txt contenesse versioni bloccate, saranno anch'esse bloccate nel file Pip. Nel mondo Pipenv, il pinning dovrebbe avvenire nel file Pipfile.lock. Pipenv darà un promemoria amichevole. Vedi sotto:

~ / git / testpipenv> richieste cat requirements.txt == 2.18.4 ~ / git / testpipenv> pipenv --three Creazione di un virtualenv per questo progetto ... Usando / usr / local / bin / python3 per creare virtualenv ... ⠋ Esecuzione di virtualenv con interprete / usr / local / bin / python3 Usando il prefisso di base '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Nuovo eseguibile python in /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 Creazione anche eseguibile in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Installazione di setuptools, pip, wheel ... terminato. Posizione Virtualenv: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt trovato, invece di Pipfile! Conversione in corso ... Attenzione: il tuo Pipfile ora contiene versioni bloccate, se il tuo file requirements.txt lo ha fatto. Ti consigliamo di aggiornare il tuo Pipfile per specificare la versione "*", invece. 

Ecco la versione bloccata nel Pipfile che è consigliabile cambiare in "*":

[pacchetti] requests = "== 2.18.4" 

Ora installiamo le dipendenze:

~ / git / testpipenv> pipenv installa Pipfile.lock non trovato, creando ... Bloccando le dipendenze [dev-packages] ... Bloccando [pacchetti] dipendenze ... Aggiornamento Pipfile.lock (0b0daf)! Installazione delle dipendenze da Pipfile.lock (0b0daf) ... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 - 00:00 : 01 Per attivare virtualenv di questo progetto, eseguire quanto segue: $ pipenv shell ~ / git / testpipenv>

Dipendenze modificabili

Si può dire a Pipenv di installare un percorso come modificabile. Ciò è utile quando dipendi dai pacchetti che stai sviluppando e vuoi dipendere dal tuo pacchetto sorgente senza installarli realmente ogni volta che apporti una modifica. In particolare, è utile per la directory corrente quando ci stai lavorando attivamente. Per farlo, usa il -e e --dev bandiere:

> pipenv install '-e.' --dev

È necessario disporre di un file setup.py corretto.

Gestire il proprio ambiente con Pipenv

Hai già visto molto di ciò che Pipenv può fare per te. Scaviamo più in profondità in alcuni comandi e opzioni aggiuntivi.

Installazione dei pacchetti

Il installazione di pipenv comando supporta diverse opzioni:

  • --dev: Installa entrambi i pacchetti di sviluppo e predefiniti da Pipfile.lock.
  • --sistema: Usa il comando pip di sistema piuttosto che il comando dal tuo virtualenv.
  • --ignore-pipfile: Ignora il Pipfile e installa da Pipfile.lock.
  • --salta-lock: Ignora il Pipfile.lock e installa dal Pipfile. Inoltre, non scrivere un Pipfile.lock che rifletta le modifiche al Pipfile. 

A seconda del flusso di lavoro e delle preferenze, potresti voler utilizzare una o più di queste opzioni in momenti diversi.

Disinstallazione dei pacchetti

Per disinstallare una dipendenza, digitare: disinstallazione di pipenv . Per esempio:

~ / git / testpipenv> richieste di disinstallazione di pipenv Richieste di disinstallazione ... Disinstallazione richieste-2.18.4: Richieste disinstallate con successo-2.18.4 Rimozione di richieste da Pipfile ... Blocco delle dipendenze [dev-packages] ... Blocco delle dipendenze [pacchetti] ... Pipfile aggiornato. blocco (625834)! 

Nota che non ho dovuto specificare "richieste == 2.8.14" durante la disinstallazione, anche se è stato bloccato nel Pipfile.

Dipendenze di blocco

Se si desidera generare un'istantanea delle dipendenze correnti (ad esempio prima di una versione), utilizzare il comando di blocco. Questa è la chiave per le build deterministiche e ripetibili: blocco pipenv --pre.

Rimozione dell'ambiente virtuale

Pipenv è fantastico, ma di tanto in tanto puoi pulire alcuni dei tuoi ambienti virtuali. È semplice come pipenv --rm.

Sicurezza

Pipfile.lock si avvale di alcuni grandi nuovi miglioramenti di sicurezza in pip. Per impostazione predefinita, Pipfile.lock verrà generato con gli hash sha256 di ciascun pacchetto scaricato. Ciò consentirà a pip di garantire che si stia installando ciò che si intende quando si trova su una rete compromessa o si scaricano dipendenze da un endpoint PyPI non attendibile.

Inoltre, Pipenv fornisce il dai un'occhiata comando, che verifica la conformità con PEP 508 - Specifica delle dipendenze per i pacchetti software Python e la sicurezza dei pacchetti:

~ / git / testpipenv> controllo pipenv. Verifica dei requisiti PEP 508 ... superato! Controllo della sicurezza del pacchetto installato ... Tutto bene!

Conclusione

Pipenv finalmente porta il packaging Python all'avanguardia del moderno sviluppo del software. Si ispira ad altri sistemi di gestione delle dipendenze di successo come Rust's Cargo e Javascript's Yarn. 

Coniuga ambienti virtuali e gestione dei pacchetti e offre un'esperienza superiore con messaggi informativi belli e colorati e best practice implicite! Consiglio vivamente di iniziare a utilizzare Pipenv per gestire i progetti Python.

Inoltre, non esitate a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato Envato, e non esitate a fare domande e fornire il vostro prezioso feedback utilizzando il feed qui sotto.