Como subir nuestro modulo de python a PYPI

¡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.

Como subir nuestro modulo de python a PYPI
 

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!

Deja una respuesta