Tabla de contenido
¡Hola de nuevo! Hoy os traemos un articulo sobre como subir nuestro modulo de python a PYPI.
Para ello hemos preparado un vídeo en el cual mostramos todo el proceso.
Empezamos:
Puedes verlo en youtube pinchando aquí
Crear el paquete de python
Lo primero que tenemos que hacer el crear correctamente, procurando dejar correctamente configurado el fichero «__init__.py» y la estructura de directorios tal y el fichero setup.py y como se ve en el vídeo y en repositorio de ejemplo (link mas abajo).
Registrarse en pypi
Para hacer la subida del paquete a PYPI tienes que acceder a la web oficial e introducir tus datos. Después nos llegará un email para verificar la dirección de correo, pinchamos en el link y tendremos lista la cuenta.
Hacer la subida del paquete al repositorio
Lo primero es crear el fichero «.pypirc» en la raiz del proyecto:
[distutils] index-server = pypi [pypi] repository: https://pypi.python.org/pypi
Después debemos instalar el paquete «twine» para poder realizar la subida:
[ger@ger-pc ejemplo_paquete]$ sudo pip install twine [sudo] password for ger: Collecting twine Downloading https://files.pythonhosted.org/packages/99/94/08b3b933c611416dad89c8abcc94a6d6c29e8609987235b6e7f10b42de82/twine-3.1.1-py3-none-any.whl Collecting pkginfo>=1.4.2 Downloading https://files.pythonhosted.org/packages/e6/d5/451b913307b478c49eb29084916639dc53a88489b993530fed0a66bab8b9/pkginfo-1.5.0.1-py2.py3-none-any.whl Collecting keyring>=15.1 Downloading https://files.pythonhosted.org/packages/28/40/2bed013b87d6d2bf4104db67bab7c8c5b5f88ff68b383dc967b6019ee9e5/keyring-21.1.0-py2.py3-none-any.whl Collecting requests-toolbelt!=0.9.0,>=0.8.0 Downloading https://files.pythonhosted.org/packages/60/ef/7681134338fc097acef8d9b2f8abe0458e4d87559c689a8c306d0957ece5/requests_toolbelt-0.9.1-py2.py3-none-any.whl (54kB) |████████████████████████████████| 61kB 2.2MB/s Requirement already satisfied: requests>=2.20 in /usr/lib/python3.8/site-packages (from twine) (2.22.0) Collecting tqdm>=4.14 Downloading https://files.pythonhosted.org/packages/47/55/fd9170ba08a1a64a18a7f8a18f088037316f2a41be04d2fe6ece5a653e8f/tqdm-4.43.0-py2.py3-none-any.whl (59kB) |████████████████████████████████| 61kB 1.2MB/s Requirement already satisfied: setuptools>=0.7.0 in /usr/lib/python3.8/site-packages (from twine) (44.0.0) Collecting readme-renderer>=21.0 Downloading https://files.pythonhosted.org/packages/c3/7e/d1aae793900f36b097cbfcc5e70eef82b5b56423a6c52a36dce51fedd8f0/readme_renderer-24.0-py2.py3-none-any.whl Collecting SecretStorage>=3; sys_platform == "linux" Downloading https://files.pythonhosted.org/packages/c3/50/8a02cad020e949e6d7105f5f4530d41e3febcaa5b73f8f2148aacb3aeba5/SecretStorage-3.1.2-py3-none-any.whl Collecting jeepney>=0.4.2; sys_platform == "linux" Downloading https://files.pythonhosted.org/packages/ae/35/7e580cfed452e3b8c3cca44290adc54b8b5a5b8e37f89da5d24b09318be8/jeepney-0.4.2-py3-none-any.whl Requirement already satisfied: chardet>=3.0.2 in /usr/lib/python3.8/site-packages (from requests>=2.20->twine) (3.0.4) Requirement already satisfied: idna>=2.5 in /usr/lib/python3.8/site-packages (from requests>=2.20->twine) (2.8) Requirement already satisfied: urllib3>=1.21.1 in /usr/lib/python3.8/site-packages (from requests>=2.20->twine) (1.25.8) Collecting bleach>=2.1.0 Downloading https://files.pythonhosted.org/packages/6e/87/f88b0e33914420fe11fe8b820c10d045a342c2a015e79ad8309de4bba820/bleach-3.1.1-py2.py3-none-any.whl (150kB) |████████████████████████████████| 153kB 1.9MB/s Requirement already satisfied: Pygments in /usr/lib/python3.8/site-packages (from readme-renderer>=21.0->twine) (2.5.2) Requirement already satisfied: six in /usr/lib/python3.8/site-packages (from readme-renderer>=21.0->twine) (1.14.0) Collecting docutils>=0.13.1 Downloading https://files.pythonhosted.org/packages/81/44/8a15e45ffa96e6cf82956dd8d7af9e666357e16b0d93b253903475ee947f/docutils-0.16-py2.py3-none-any.whl (548kB) |████████████████████████████████| 552kB 1.5MB/s Requirement already satisfied: cryptography in /usr/lib/python3.8/site-packages (from SecretStorage>=3; sys_platform == "linux"->keyring>=15.1->twine) (2.8) Requirement already satisfied: webencodings in /usr/lib/python3.8/site-packages (from bleach>=2.1.0->readme-renderer>=21.0->twine) (0.5.1) Requirement already satisfied: cffi!=1.11.3,>=1.8 in /usr/lib/python3.8/site-packages (from cryptography->SecretStorage>=3; sys_platform == "linux"->keyring>=15.1->twine) (1.13.2) Requirement already satisfied: pycparser in /usr/lib/python3.8/site-packages (from cffi!=1.11.3,>=1.8->cryptography->SecretStorage>=3; sys_platform == "linux"->keyring>=15.1->twine) (2.19) Installing collected packages: pkginfo, jeepney, SecretStorage, keyring, requests-toolbelt, tqdm, bleach, docutils, readme-renderer, twine Successfully installed SecretStorage-3.1.2 bleach-3.1.1 docutils-0.16 jeepney-0.4.2 keyring-21.1.0 pkginfo-1.5.0.1 readme-renderer-24.0 requests-toolbelt-0.9.1 tqdm-4.43.0 twine-3.1.1 [ger@ger-pc ejemplo_paquete]$ python setup.py sdist running sdist running egg_info creating ejemplo_paquete.egg-info writing ejemplo_paquete.egg-info/PKG-INFO writing dependency_links to ejemplo_paquete.egg-info/dependency_links.txt writing entry points to ejemplo_paquete.egg-info/entry_points.txt writing requirements to ejemplo_paquete.egg-info/requires.txt writing top-level names to ejemplo_paquete.egg-info/top_level.txt writing manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' reading manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' writing manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' running check creating ejemplo_paquete-1.0.0 creating ejemplo_paquete-1.0.0/ejemplo_paquete creating ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying files to ejemplo_paquete-1.0.0... copying README.rst -> ejemplo_paquete-1.0.0 copying setup.py -> ejemplo_paquete-1.0.0 copying ejemplo_paquete/__init__.py -> ejemplo_paquete-1.0.0/ejemplo_paquete copying ejemplo_paquete/ejemplo_paquete_mod.py -> ejemplo_paquete-1.0.0/ejemplo_paquete copying ejemplo_paquete.egg-info/PKG-INFO -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/SOURCES.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/dependency_links.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/entry_points.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/requires.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/top_level.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info Writing ejemplo_paquete-1.0.0/setup.cfg creating dist Creating tar archive removing 'ejemplo_paquete-1.0.0' (and everything under it)
Ahora ya podemos subir nuestro paquete:
[ger@ger-pc ejemplo_paquete]$ python setup.py sdist running sdist running egg_info creating ejemplo_paquete.egg-info writing ejemplo_paquete.egg-info/PKG-INFO writing dependency_links to ejemplo_paquete.egg-info/dependency_links.txt writing entry points to ejemplo_paquete.egg-info/entry_points.txt writing requirements to ejemplo_paquete.egg-info/requires.txt writing top-level names to ejemplo_paquete.egg-info/top_level.txt writing manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' reading manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' writing manifest file 'ejemplo_paquete.egg-info/SOURCES.txt' running check creating ejemplo_paquete-1.0.0 creating ejemplo_paquete-1.0.0/ejemplo_paquete creating ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying files to ejemplo_paquete-1.0.0... copying README.rst -> ejemplo_paquete-1.0.0 copying setup.py -> ejemplo_paquete-1.0.0 copying ejemplo_paquete/__init__.py -> ejemplo_paquete-1.0.0/ejemplo_paquete copying ejemplo_paquete/ejemplo_paquete_mod.py -> ejemplo_paquete-1.0.0/ejemplo_paquete copying ejemplo_paquete.egg-info/PKG-INFO -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/SOURCES.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/dependency_links.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/entry_points.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/requires.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info copying ejemplo_paquete.egg-info/top_level.txt -> ejemplo_paquete-1.0.0/ejemplo_paquete.egg-info Writing ejemplo_paquete-1.0.0/setup.cfg creating dist Creating tar archive removing 'ejemplo_paquete-1.0.0' (and everything under it)
[ger@ger-pc ejemplo_paquete]$ twine upload dist/* Uploading distributions to https://upload.pypi.org/legacy/ Enter your username: aprendeit Enter your password: Uploading ejemplo_paquete-1.0.0.tar.gz 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7.00k/7.00k [00:02<00:00, 2.87kB/s] View at: https://pypi.org/project/ejemplo-paquete/1.0.0/ [ger@ger-pc ejemplo_paquete]$
Una vez subido, podemos instalarlo:
[ger@ger-pc /]$ pip install ejemplo_paquete Requirement already satisfied: ejemplo_paquete in /usr/lib/python3.8/site-packages (1.0.0) Requirement already satisfied: requests in /usr/lib/python3.8/site-packages (from ejemplo_paquete) (2.22.0) Requirement already satisfied: chardet>=3.0.2 in /usr/lib/python3.8/site-packages (from requests->ejemplo_paquete) (3.0.4) Requirement already satisfied: idna>=2.5 in /usr/lib/python3.8/site-packages (from requests->ejemplo_paquete) (2.8) Requirement already satisfied: urllib3>=1.21.1 in /usr/lib/python3.8/site-packages (from requests->ejemplo_paquete) (1.25.8) [ger@ger-pc /]$
Ahora script está disponible tanto para ejecutarse como para importar:
[ger@ger-pc ~]$ ejemplo_paquete 88.9.201.295 [ger@ger-pc ~]$ python Python 3.8.1 (default, Jan 22 2020, 06:38:00) [GCC 9.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from ejemplo_paquete import ejemplo_paquete_mod >>> ejemplo_paquete_mod.get_my_ip() '88.9.201.295' >>> [ger@ger-pc ~]$
Otros datos
El código se puede descargar de:
https://github.com/AprendeIT/ejemplo_paquete
El paquete se encuentra listo para instalarse en:
https://pypi.org/project/ejemplo-paquete/1.0.0
Documentación oficial: https://packaging.python.org/guides/distributing-packages-using-setuptools/?highlight=pypirc#id78
Si te ha gustado el artículo deja tu comentario y/o compártelo en tus redes sociales para llegar a un mayor número de personas.
Aquí puedes ver mas trucos de python
¡Hasta pronto!