¿Cómo se usan Pipfile y Pipfile.lock?

132

Parece que Pipfile / Pipfile.lock están destinados a ser reemplazos de require.txt, en el contexto del empaquetado de Python. Sin embargo, no hay mucha documentación sobre cómo funcionan realmente. Encontré una descripción evolutiva de pipfile en la sección PyPi del sitio web de Python aquí, pero es bastante desordenada y no explica la semántica de las diferentes secciones del archivo.

¿Algún indicador sobre cómo entender estos archivos?

Stephen
fuente
2
Este es un análogo directo de Gemfiley Gemfile.lockdesde el mundo Ruby: el .lockarchivo tiene versiones específicas para cada dependencia; el que no tiene esa extensión solo tiene las versiones conocidas por los humanos que controlan. Dicho esto, pedir una explicación de algo que todavía está evolucionando y que está muy lejos de estar bien definido, mucho menos estandarizado, es quizás un poco prematuro.
Charles Duffy
(Y de manera similar, la diferencia entre Pipfiley requirements.txtes en gran medida que el primero trata de adoptar características del mundo Ruby, es decir, poder especificar conjuntos de dependencias para entornos múltiples y con condiciones / opciones / etc. dentro de un solo archivo).
Charles Duffy
1
Parece que ya se ha implementado en el repositorio "empezando con Python" de Heroku ( github.com/heroku/python-getting-started.git ) así que nos guste o no, parece que está en producción.
Stephen
Gotcha Dicho esto, los documentos me parecen bastante sólidos. No sé lo que podría escribir en una respuesta que no solo los reformule.
Charles Duffy
1
Si te estás refiriendo al enlace que hice en el OP, entonces hay una serie de cosas omitidas, por ejemplo, qué significa realmente que algo esté en una sección llamada fuente.
Stephen

Respuestas:

166

El concepto detrás de estos archivos es simple y análogo a otras herramientas ya existentes, si está familiarizado con Ruby's Bundler o Node's Npm. Pipenves una herramienta de gestión de entornos virtuales y paquetes que utiliza los archivos Pipfile y Pipfile.lock para lograr estos objetivos.

Pipenv maneja el entorno virtual por usted de una manera estándar predeterminada (no se requiere activar ni desactivar más). A continuación, algunos conceptos básicos para comenzar, vea más en el sitio web de pipenv .

Empezando

Comenzar a usar pipenv es fácil, en su carpeta de proyecto escriba ...

$ pipenv install

... y si ya tiene un requirements.txtarchivo, generará un Pipfilearchivo con los requisitos y una carpeta de entorno virtual, de lo contrario, generará un Pipfilearchivo vacío . Si no le gustó o cambió de opinión acerca de algo que instaló, simplemente escriba ...

$ pipenv uninstall <package>

... y estás listo para irte. Para activar el entorno virtual que pipenv ya generó, vaya con ...

$ pipenv shell

... y su entorno virtual se activará. Para salir del medio ambiente ...

$ exit

... y volverá a su sesión de terminal original.

Pipfile

El archivo Pipfile está destinado a especificar los requisitos de paquetes para su aplicación o biblioteca de Python, tanto para el desarrollo como para la ejecución. Puede instalar un paquete simplemente usando ...

$ pipenv install flask

... y se agregará como una dependencia para la implementación y ejecución o mediante el uso de ...

$ pipenv install --dev pytest

... y se usará como dependencia para el tiempo de desarrollo. La sintaxis del archivo es bastante sencilla, como sigue.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

El Pipfile.lock tiene la intención de especificar, en base a los paquetes presentes en Pipfile , qué versión específica de esos debe usarse, evitando los riesgos de actualizar automáticamente los paquetes que dependen unos de otros y romper el árbol de dependencia de su proyecto.

Puede bloquear sus paquetes instalados actualmente usando ...

$ pipenv lock

... y la herramienta buscará su carpeta de entorno virtual para generar el archivo de bloqueo automáticamente, en función de las versiones instaladas actualmente. La sintaxis del archivo no es tan obvia como lo es para Pipfile , por lo que, en aras de la concisión, no se mostrará aquí.

danieldeveloper001
fuente
Esta es una respuesta interesante, pero creo que cuando estaba preguntando no pude entender lo que realmente significa [[source]], ¿es que la fuente de los paquetes descargados por pipenv o algo más? Supongo que el resto de los dos archivos es bastante obvio.
Stephen
1
Lo admito, me pareció confuso porque estoy trabajando en un tutorial en el que tengo que decidir si la diferencia [paquete] / [paquete-dev] es importante, o si debería poner todo en [paquete]. (Buscar en Google esto es lo que me llevó a esta página). Pero tener ambas cosas al poner cosas de desarrollo en [paquete] me arrojó. Sin embargo, pude ver por qué las solicitudes deberían estar en [paquete].
Al Sweigart el
1
Cambiado, según lo solicitado, para evitar confusiones en los paquetes de desarrollo, gracias por tu comentario, espero que ahora sea menos confuso :)
danieldeveloper001
1
Creo que es una buena idea, si desea realizar un seguimiento de las versiones de los paquetes a lo largo de la evolución del código fuente, ya que la mayoría de los paquetes serán protagonizados por la versión Pipfile. Si algo se rompe en la actualización de un paquete, uno debería poder solucionarlo revisando el historial de versiones del paquete, y de hecho, uno de los creadores de la biblioteca de solicitudes recomienda hacerlo aquí .
danieldeveloper001
1
@Stephen, en realidad es lo contrario, como se indica en la documentación de instalación de pipenv , puede especificar el --skip-lockindicador para obligarlo a ignorar el Pipfile.lockarchivo en lugar de obligarlo a usarlo;)
danieldeveloper001