Revisando Python Packaging Con Pipenv

Visión general

Python es uno de los lenguajes más amigables y poderosos que existen. Es fácil de aprender para los principiantes, pero tiene un fuerte impacto y se usa ampliamente en diversos dominios como la programación científica, la programación de aplicaciones web y DevOps. Pero uno de los puntos más débiles de Python ha sido su soporte para empaquetar aplicaciones complejas y sus dependencias.. 

A lo largo de los años, se han realizado muchos esfuerzos para mejorar la situación. En agosto de 2017, escribí un tutorial sobre el estado del arte en el empaque de Python: Cómo escribir, empaquetar y distribuir una biblioteca en Python. 

Han pasado solo cuatro meses, y hay un nuevo jugador en la ciudad. Pipenv es ahora la herramienta oficialmente recomendada para envasado por PyPA (Python Packaging Authority). En este tutorial, aprenderá por qué Pipenv mejora significativamente el estado de empaquetado y el flujo de trabajo de desarrollo general para los desarrolladores de Python y cómo usarlo de manera efectiva.

Flujo de trabajo de desarrollo de Python para humanos

El objetivo de Pipenv es mejorar el flujo de trabajo de desarrollo de los desarrolladores de Python cuando se trata de administrar dependencias y entornos virtuales. Es otra excelente biblioteca del laborioso Kenneth Reitz, conocido principalmente por el paquete de solicitudes (HTTP para humanos), pero escribió algunos otros excelentes paquetes.. 

¿Necesitamos otra herramienta de embalaje??

¡Sí! Pipenv toma una página de las prácticas modernas de administración de paquetes y las importa al mundo Python. 

Instalación de Pipenv

Puede instalar Pipenv con pip instalar pipenv. Obtendrás una buena salida con emojis:

$ pip install pipenv ✨🍰✨ 

Tendrás que hacerlo solo una vez. Si no tiene instalado pip, puede usar este comando bootstrap: $ rizo https://github.com/pypa/pipenv/blob/master/get-pipenv.py | pitón

Pipfile y Pipfile.lock

Pipenv puede crear un entorno virtual vacío para usted. Aquí hay una demostración rápida: 

~ / git> mkdir testpipenv ~ / git> cd testpipenv ~ / git / testpipenv> pipenv - tres Resultados: Creando un virtualenv para este proyecto ... Usando / usr / local / bin / python3 para crear virtualenv ... ⠋ Ejecutando virtualenv con intérprete / usr / local / bin / python3 Usando el prefijo base '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Nuevo ejecutable de python en /Users/gigi.sayfan/.local/share/ virtualenvs / testpipenv-0GShD6dy / bin / python3.6 También se crea un archivo ejecutable en /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Instalación de accesorios, pip, rueda ... listo. Ubicación de Virtualenv: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Creando un Pipfile para este proyecto ... 

Esto creará un Pipfile vacío sin dependencias. Pero como probablemente querrá instalar algunos paquetes para su proyecto, puede usar pipenv para instalar un paquete y creará el entorno virtual automáticamente. Por ejemplo:

~ / git / testpipenv> solicitudes de instalación de pipenv Salida: instalación de solicitudes ... Recopilación de solicitudes Uso de solicitudes en caché-2.18.4-py2.py3-none-any.whl Recopilación de idna<2.7,>= 2.5 (de las solicitudes) Usando idna-2.6-py2.py3-none-any.whl en caché Recopilando chardet<3.1.0,>= 3.0.2 (a partir de solicitudes) Uso de chardet-3.0.4-py2.py3-none-any.whl en caché Recopilación de certifi> = 2017.4.17 (de solicitudes) Uso de certifi-2017.11.5-py2.py3-none en caché any.whl coleccionando urllib3<1.23,>= 1.21.1 (de solicitudes) Usando urllib3-1.22-py2.py3-none-any.whl en caché Instalando los paquetes recolectados: idna, chardet, certifi, urllib3, solicitudes Se instaló con éxito certifi-2017.11.5 chardet-3.0.4 idna- 2.6 peticiones-2.18.4 urllib3-1.22 Agregando peticiones a los [paquetes] de Pipfile ... PD: ¡Tiene un gusto excelente! ✨ 🍰 ✨ Bloqueo de dependencias [dev-packages] ... Bloqueo de [paquetes] dependencias ... Pipfile.lock actualizado (7b8df8)! 

El nivel de detalle es excelente y también utiliza colores agradables. Aquí está el Pipfile resultante:

[[fuente]] url = "https://pypi.python.org/simple" verify_ssl = nombre verdadero = "pypi" [dev-packages] [paquetes] peticiones = "*" [requiere] python_version = "3.6" 

El archivo Pip realiza un seguimiento de las dependencias de nivel superior de su proyecto: aquí, solo peticiones = "*". Utiliza TOML como formato, que es una opción popular en estos días para los archivos de configuración (Rust's Cargo, Python's PEP-518). 

El archivo Pipefile.lock, por otro lado, es un archivo JSON que especifica algunos metadatos y las versiones exactas (incluidos los hashes) de todas las dependencias recursivas (dependencias de nivel superior y sus dependencias). Aquí está el archivo Pipfile.lock:

"_meta": "hash": "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8" "" "" "" "" "" "" "" "" "Dependencia" " : "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 : Mié 4 de octubre 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], "por defecto":  "certifi":  "hash": [ "SHA256: 244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", "sha256: 5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0"], "versión":" == 2017.11.5 "," chardet ": " hashes ": [" sha256: fc323ffcaeaed0e0a02bf4d117757b98 aed530d9ed4531e3e15460124c106691" , "sha256: 84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"], "versión": "== 3.0.4", "IDNA":  "hashes": [ "sha256: 8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", "sha256: 2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"], "versión": "== 2.6", "solicitudes":  "hashes": [ "sha256: 6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", "sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"], "versión": "== 2.18.4" "urllib3":  "hashes '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 

Si desea ver un gráfico de todas sus dependencias, escriba: gráfico de pipenv

~ / git / testpipenv> solicitudes del gráfico de pipenv == 2.18.4 - certifi [requerido:> = 2017.4.17, instalado: 2017.11.5] - chardet [requerido:> = 3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.7,>= 2.5, instalado: 2.6] - urllib3 [requerido:> = 1.21.1,<1.23, installed: 1.22]

Usando Paquetes Instalados Con Pipenv

Una vez que haya instalado un paquete con Pipenv, podrá acceder a él en su entorno virtual como si fuera un paquete estándar (igual que si lo hubiera instalado). La única precaución es que debe utilizar su intérprete de entorno virtual. Pipenv proporciona dos comandos útiles: correr y cáscara

Tu usas pipenv ejecutar python .py para ejecutar tu programa, y ​​usas pipenv shell para iniciar un nuevo shell con su intérprete Python de entorno virtual. Aquí se explica cómo usar el comando de shell para iniciar una sesión interactiva de Python que usa el paquete de solicitudes instaladas para obtener una cotización del día de una API REST. El entorno virtual está activado, y al iniciar Python se usa el intérprete correcto donde peticiones está disponible.

~ / git / testpipenv> shell pipenv Shell de entorno de desove (/ bin / bash). Utilice 'salir' para salir. source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate ~ / git / testpipenv> source /Users/gigi.sayfota de los niños / Cáscara / vividual / compartido (testpipenv-0GShD6dy) ~ / git / testpipenv> python Python 3.6.3 (predeterminado, 19 de noviembre de 2017, 16:39:12) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] en darwin Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información. >>> importar solicitudes >>> r = requests.get ('https://quotes.rest/qod') >>> r.ok True >>> r.json () 'success': 'total' : 1, 'contenidos': 'citas': ['cita': 'Salir con gente que es mejor que tú', 'autor': 'Warren Buffett', 'longitud': Ninguna, 'etiquetas' : ['Getting-better', 'inspirar', 'personas'], 'categoría': 'inspirar', 'título': 'Cita inspiradora del día', 'fecha': '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') Salir con personas que están Mejor que tu. ~~ Warren Buffett >>>

Importando desde requisitos.txt

Si desea migrar un proyecto existente con un requisito.txt, Pipenv lo tiene cubierto. Simplemente: pipenv instalar -r .

Todas sus dependencias serán importadas en el archivo Pip. Para instalar realmente las dependencias y generar el Pipfile.lock, necesita instalación de pipenv. Una vez que haya verificado que todo funciona como se esperaba, puede eliminar el archivo Requirements.txt.

Si su require.txt existe en el mismo directorio en el que crea el entorno virtual, Pipenv generará automáticamente el Pipfile. Pero tenga en cuenta que si su archivo Requirements.txt contiene versiones ancladas, también se fijarán en el Pipfile. En el mundo Pipenv, la fijación debe realizarse en el archivo Pipfile.lock. Pipenv dará un recordatorio amistoso. Vea abajo:

~ / git / testpipenv> cat Requirements.txt peticiones == 2.18.4 ~ / git / testpipenv> pipenv - tres Crear un virtualenv para este proyecto ... Usar / usr / local / bin / python3 para crear virtualenv ... ⠋ Ejecutar virtualenv con interpreter / usr / local / bin / python3 Usando el prefijo base '/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6' Nuevo ejecutable de python en /Users/gigi.sayfan/.local/ share / virtualenvs / testpipenv-0GShD6dy / bin / python3.6 También crea un ejecutable en /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python Instalación de herramientas, pip, rueda ... listo. Ubicación de Virtualenv: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy Requirements.txt encontrado, en lugar de Pipfile! Conversión ... Advertencia: su Pipfile ahora contiene versiones ancladas, si sus requisitos.txt lo hicieron. Recomendamos actualizar su Pipfile para especificar la versión "*", en su lugar. 

Aquí está la versión anclada en el archivo Pip que se recomienda cambiar a "*":

[paquetes] peticiones = "== 2.18.4" 

Instalemos las dependencias ahora:

~ / git / testpipenv> pipenv instale Pipfile.lock no encontrado, creando ... Bloqueando las dependencias [dev-packages] ... Bloqueando las dependencias [packages]… ¡Pipfile.lock actualizado (0b0daf)! Instalación de dependencias desde Pipfile.lock (0b0daf) ... 🐍 5/5 - 00:00 : 01 Para activar el virtualenv de este proyecto, ejecute lo siguiente: $ pipenv shell ~ / git / testpipenv>

Dependencias editables

Puedes decirle a Pipenv que instale una ruta como editable. Esto es útil cuando depende de los paquetes que está desarrollando y quiere depender de su paquete fuente sin instalarlos realmente cada vez que realiza un cambio. En particular, es útil para el directorio actual cuando está trabajando activamente en él. Para hacer eso, usa el -mi y --dev banderas:

> pipenv instalar '-e' --dev

Necesitas tener un archivo setup.py apropiado.

Gestionando tu entorno con Pipenv

Ya has visto mucho de lo que Pipenv puede hacer por ti. Vamos a profundizar en algunos comandos y opciones adicionales.

Instalación de paquetes

los instalación de pipenv comando soporta varias opciones:

  • --dev: Instale los paquetes desarrollados y predeterminados desde Pipfile.lock.
  • --sistema: Use el comando pip del sistema en lugar del comando de su virtualenv.
  • --ignorar-pipfile: Ignore el archivo Pip e instale desde el archivo Pipfile.lock.
  • --bloqueo de salto: Ignore el archivo Pipfile.lock e instale desde el archivo Pip. Además, no escriba un archivo Pipfile.lock que refleje los cambios en el archivo Pipfile.. 

Dependiendo de su flujo de trabajo y sus preferencias, es posible que desee utilizar una o más de estas opciones en diferentes momentos.

Desinstalar paquetes

Para desinstalar una dependencia, escriba: pipenv desinstalar . Por ejemplo:

~ / git / testpipenv> solicitudes de desinstalación de pipenv Desinstalando solicitudes ... Desinstalando peticiones-2.18.4: Solicitudes exitosas-2.18.4 Eliminando solicitudes de Pipfile ... Bloqueando dependencias [dev-packages] ... Bloqueando dependencias [paquetes] ... Pipfile actualizado. cerradura (625834)! 

Tenga en cuenta que no tuve que especificar "peticiones == 2.8.14" al desinstalar, a pesar de que estaba anclado en el Pipfile.

Bloqueo de dependencias

Si desea generar una instantánea de sus dependencias actuales (por ejemplo, antes de una versión), use el comando de bloqueo. Esta es la clave para construcciones deterministas y repetibles: pipenv lock --pre.

Eliminar el entorno virtual

Pipenv es increíble, pero puede limpiar algunos de sus entornos virtuales de vez en cuando. Es tan simple como pipenv --rm.

Seguridad

Pipfile.lock aprovecha algunas nuevas mejoras de seguridad en pip. De forma predeterminada, el archivo Pipfile.lock se generará con los hashes sha256 de cada paquete descargado. Esto permitirá que pip garantice que está instalando lo que pretende cuando está en una red comprometida o descargando dependencias desde un punto final de PyPI no confiable.

Además, Pipenv proporciona la comprobar comando, que verifica el cumplimiento con PEP 508 - Especificación de dependencia para paquetes de software de Python, así como seguridad de paquetes:

~ / git / testpipenv> verificación de pipenv. Verificando los requisitos de PEP 508… ¡Aprobado! Comprobando la seguridad del paquete instalado ... Todo bien!

Conclusión

Pipenv finalmente lleva el empaque de Python a la vanguardia del desarrollo de software moderno. Se inspira en otros exitosos sistemas de administración de dependencias como Rust's Cargo y Javascript's Yarn.. 

Combina los entornos virtuales y la administración de paquetes, y proporciona una experiencia superior con mensajes informativos hermosos y coloridos, y las mejores prácticas implícitas. Le recomiendo que comience a usar Pipenv para administrar sus proyectos de Python.

Además, no dude en ver lo que tenemos disponible para la venta y para el estudio en el mercado de Envato, y no dude en hacer cualquier pregunta y proporcionar sus valiosos comentarios utilizando la siguiente información..