Cómo compartir tus paquetes de Python
() translation by (you can also view the original English article)
Descripción general
Los paquetes de Python son los componentes básicos de las aplicaciones de Python. Encapsulan algunas funciones coherentes que pueden ser importadas y utilizadas por muchas aplicaciones y sistemas. Pero primero, los desarrolladores deben encontrar su paquete y poder instalarlo. Python proporciona un repositorio público gratuito para paquetes, que es el estándar de facto para compartir paquetes de Python. También puedes utilizar repositorios de paquetes privados para paquetes propietarios.
En este tutorial aprenderás a compartir tus propios paquetes con la comunidad. Si tienes paquetes patentados que necesitas compartir solo dentro de tu empresa, también aprenderás a hacerlo.
Para obtener información básica, consulta Cómo usar paquetes de Python y Cómo escribir tus propios paquetes de Python.
¿Qué es PyPI?
PyPI son las siglas de Python Package Index. Es un repositorio público para cargar tus paquetes. Pip conoce PyPI y puedes instalar y/o actualizar paquetes desde PyPI. PyPI solía llamarse "Cheese Shop" después del famoso boceto de Monty Python. Si escuchas que la gente se refiere a la "Cheese Shop" en un contexto de empaquetado de Python, no te alarmes. Es solo PyPI.
Preparar un paquete para cargar
Antes de cargar un paquete, debes tener un paquete. Usaré el paquete conman que presenté en el artículo Cómo escribir tus propios paquetes de Python. Dado que PyPI contiene miles de paquetes, es muy importante poder describir tu paquete correctamente si deseas que la gente lo encuentre. PyPI admite un impresionante conjunto de etiquetas de metadatos para permitir que las personas encuentren el paquete adecuado para el trabajo.
El archivo setup.py contiene mucha información importante que se utiliza para instalar tu paquete. Pero también puedes incluir los metadatos utilizados para clasificar tu paquete en PyPI. Los paquetes se clasifican mediante varias etiquetas de metadatos. Algunos de ellos son textuales y algunos de ellos tienen una lista de valores posibles. La lista completa está disponible en la página Clasificadores de lista de PyPI.
Agreguemos algunos clasificadores a setup.py
. No es necesario incrementar el número de versión, ya que son solo metadatos y el código sigue siendo el mismo:
1 |
from setuptools import setup, find_packages |
2 |
|
3 |
|
4 |
|
5 |
setup(name='conman', |
6 |
|
7 |
version='0.3', |
8 |
|
9 |
url='https://github.com/the-gigi/conman', |
10 |
|
11 |
license='MIT', |
12 |
|
13 |
author='Gigi Sayfan', |
14 |
|
15 |
author_email='the.gigi@gmail.com', |
16 |
|
17 |
description='Manage configuration files', |
18 |
|
19 |
classifiers=[ |
20 |
|
21 |
'Development Status :: 3 - Alpha', |
22 |
|
23 |
'Intended Audience :: Developers', |
24 |
|
25 |
'Topic :: Software Development :: Libraries', |
26 |
|
27 |
'License :: OSI Approved :: MIT License', |
28 |
|
29 |
'Programming Language :: Python :: 2', |
30 |
|
31 |
'Programming Language :: Python :: 2.6', |
32 |
|
33 |
'Programming Language :: Python :: 2.7', |
34 |
|
35 |
],
|
36 |
|
37 |
packages=find_packages(exclude=['tests']), |
38 |
|
39 |
long_description=open('README.md').read(), |
40 |
|
41 |
zip_safe=False, |
42 |
|
43 |
setup_requires=['nose>=1.0'], |
44 |
|
45 |
test_suite='nose.collector') |
Crea una cuenta
Debes crear una cuenta en PyPI para poder cargar paquetes. Completa este formulario y verifica tu identidad haciendo clic en la URL en el correo electrónico de verificación. Ahora, debes crear un archivo .pypyrc
en tu directorio de inicio que contendrá la información necesaria para cargar paquetes.
1 |
[distutils] |
2 |
|
3 |
index-servers=pypi |
4 |
|
5 |
|
6 |
|
7 |
[pypi] |
8 |
|
9 |
repository = https://pypi.python.org/pypi |
10 |
|
11 |
username = the_gigi |
12 |
También puedes agregar tu contraseña, pero es más seguro si no lo haces en caso de que algún elemento malo se apodere de tu computadora portátil. Esto es especialmente importante si cargas paquetes populares porque si alguien puede cargar o actualizar tus paquetes, todas las personas que usan estos paquetes serán vulnerables.
Pruebas
Si deseas probar el proceso de registro y carga del paquete y no preocuparte por publicar algo incompleto, puedes trabajar con el alternativo sitio de prueba de PyPI. Amplía tu archivo ~/.pypirc para incluir una sección 'pypitest'.
1 |
[distutils] |
2 |
|
3 |
index-servers= |
4 |
|
5 |
pypi |
6 |
|
7 |
pypitest |
8 |
|
9 |
|
10 |
|
11 |
[pypitest] |
12 |
|
13 |
repository = https://testpypi.python.org/pypi |
14 |
|
15 |
username = the_gigi |
16 |
|
17 |
|
18 |
|
19 |
[pypi] |
20 |
|
21 |
repository = https://pypi.python.org/pypi |
22 |
|
23 |
username = the_gigi |
24 |
Recuerda que el sitio de prueba se limpia con regularidad, así que no confíes en él. Está destinado únicamente a fines de prueba.
Registra tu paquete
Si esta es la primera versión de tu paquete, debes registrarlo con PyPI. Twine tiene un comando de registro, pero no sé cómo usarlo. Seguir la documentación produce un error, y al verificar las pruebas unitarias para twine, no hay ninguna prueba para el comando de registro. Oh, bien. También puedes hacerlo manualmente utilizando este formulario para cargar el archivo PKG-INFO. Si usas Python 2.7.9+ o Python 3.2+, también puedes registrarte de manera segura usando python setup.py.register
.
Registremos conman en el sitio de prueba de PyPI. Ten en cuenta el -r pypitest
, que según la sección en ~/.pypirc
se registrará en el sitio de prueba.
1 |
python setup.py register -r pypitest
|
2 |
|
3 |
running register |
4 |
|
5 |
running egg_info |
6 |
|
7 |
writing conman.egg-info/PKG-INFO |
8 |
|
9 |
writing top-level names to conman.egg-info/top_level.txt |
10 |
|
11 |
writing dependency_links to conman.egg-info/dependency_links.txt |
12 |
|
13 |
reading manifest file 'conman.egg-info/SOURCES.txt'
|
14 |
|
15 |
reading manifest template 'MANIFEST.in'
|
16 |
|
17 |
writing manifest file 'conman.egg-info/SOURCES.txt'
|
18 |
|
19 |
running check |
20 |
|
21 |
Password: |
22 |
|
23 |
Registering conman to https://testpypi.python.org/pypi |
24 |
|
25 |
Server response (200): OK |
Twine
Puedes cargar un paquete usando python setup.py upload
, pero no es seguro, ya que solías enviar tu nombre de usuario y contraseña a través de HTTP hasta Python 2.7.9 y Python 3.2. Twine siempre usa HTTPS y tienes beneficios adicionales como cargar distribuciones creadas previamente, y es compatible con cualquier formato de empaque, incluidas las ruedas. Usaré twine para la carga real.
Twine no forma parte de la biblioteca estándar, por lo que debes instalarlo: pip install twine
.
Carga tu paquete
Finalmente, es hora de cargar el paquete.
1 |
> twine upload -r pypitest -p ******* dist/* |
2 |
|
3 |
Uploading distributions to https://testpypi.python.org/pypi |
4 |
|
5 |
Uploading conman-0.3-py2-none-any.whl |
6 |
|
7 |
Uploading conman-0.3-py2.py3-none-any.whl |
8 |
|
9 |
Uploading conman-0.3.tar.gz |
Twine subió todos los formatos de distribución, tanto la fuente como las ruedas.



Prueba tu paquete
Una vez que tu paquete esté en PyPI, debes asegurarte de poder instalarlo y de que todo funcione. Aquí creo un entorno virtual único, pip install conman desde el sitio de pruebas de PyPI y luego lo importo. Es posible que desees ejecutar pruebas más completas para tu paquete.
1 |
> mkvirtualenv test_conman_pypi
|
2 |
|
3 |
New python executable in test_conman_pypi/bin/python2.7
|
4 |
|
5 |
Also creating executable in test_conman_pypi/bin/python
|
6 |
|
7 |
Installing setuptools, pip...done. |
8 |
|
9 |
Usage: source deactivate
|
10 |
|
11 |
|
12 |
|
13 |
removes the 'bin' directory of the environment activated with 'source |
14 |
|
15 |
activate' from PATH.
|
16 |
|
17 |
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conman |
18 |
|
19 |
Downloading/unpacking conman |
20 |
|
21 |
Downloading conman-0.3-py2-none-any.whl |
22 |
|
23 |
Storing download in cache at /Users/gigi/.cache/pip/https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl
|
24 |
|
25 |
Installing collected packages: conman |
26 |
|
27 |
Successfully installed conman |
28 |
|
29 |
Cleaning up... |
30 |
|
31 |
(test_conman_pypi) > python |
32 |
|
33 |
Python 2.7.10 (default, Jun 10 2015, 19:43:32) |
34 |
|
35 |
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin |
36 |
|
37 |
Type "help", "copyright", "credits" or "license" for more information. |
38 |
|
39 |
>>> import conman
|
40 |
|
41 |
>>>
|
Ten en cuenta que la distribución de la rueda se instaló de forma predeterminada.
Control de versiones
Cuando evolucionas tus paquetes y cargas nuevas versiones, es importante seguir un esquema de control de versiones sensato. Las personas se enojarán bastante si una actualización involuntaria rompe su código. Tu esquema de control de versiones debe cumplir con PEP-440 - Especificación de identificación y dependencia de la versión.
Esta especificación permite elegir entre varios esquemas. Recomiendo usar el popular esquema de control de versiones semántico. Es más o menos "<major>.<minor>.<patch>", que corresponde a “<major>.<minor>.<micro>" de PEP-440. Solo ten cuidado con las versiones que continúan con el guión o el signo más, que no son compatibles con PEP-440.
Repositorios de paquetes privados
PyPI es genial, pero a veces no quieres compartir tus paquetes. Muchas empresas y organizaciones tienen equipos de ingeniería que usan Python y necesitan compartir paquetes entre ellos, pero no pueden compartirlos públicamente en PyPI. Esto no es un problema. Puedes compartir paquetes en repositorios de paquetes privados bajo tu control.
Ten en cuenta que a veces es posible que desees tener un repositorio de paquetes privado bajo tu control solo para administrar tus dependencias de terceros. Por ejemplo, el autor de un paquete puede decidir eliminar un paquete de PyPI. Si tu sistema depende de poder instalar este paquete desde PyPI, estás en problemas.
Devpi
Devpi (que significa Development Package Index) es un reemplazo directo del servidor público PyPI. Es de código abierto y tiene licencia del MIT, por lo que puedes ejecutarlo dentro de tu cortafuegos. Devpi es muy poderoso y tiene muchas características que le permiten funcionar como tu servidor de empaquetado definitivo:
- Espejo PyPI rápido
- Carga, prueba y puesta en escena con índices privados
- Herencia del índice
- Interfaz web y búsqueda
- Replicación
- Importación/Exportación
- Integración de Jenkins
Devpi tiene una excelente documentación, un sistema de complementos y está en desarrollo activo con una comunidad vibrante.
Conclusión
Python proporciona una solución completa para alojar tus paquetes y ponerlos a disposición de tus compañeros Pythonistas. Hay un proceso simplificado asistido por herramientas para empaquetar y cargar paquetes y hacerlos fáciles de encontrar e instalar.
Si necesitas mantener las cosas en privado, Devpi está aquí para ti como un repositorio de paquetes privado maduro y robusto.