Nota1: Este post es una traducción del original en ingles por lo tanto es posible que algunas palabras clave en las instrucciones de código están traducidas también al español y se deban corregir para que la ejecución del código sea satisfactoria.
Cómo crear una librería de Python
Antonio Fernández Troyano, Follow, 6 min read,
Pero, ¿qué es una librería en programación?
En programación, una librería es un conjunto de funcionalidades empaquetadas que permiten a los usuarios realizar nuevas tareas que inicialmente no podían llevar a cabo
En Python existen un montón de librerías que utilizamos diariamente, entre otras:
- Numpy y Pandas para tratamiento numérico y tabular
- Sklearn para machine learning
- Matplotlib y Seaborn para visualización
- Requests y bs4 para web scraping
Muchas veces el día a día nos impide darle un “second order thinking” a las cosas, como por ejemplo:
- ¿Cómo se programaron esas librerías que tanto usamos?
- ¿Puedo yo programar una librería?
- ¿Cómo podría compartir mis funciones para que otras personas se beneficien de mi esfuerzo y trabajo?
Pero, ¿y si queremos crear nuestra propia librería de Python y publicarla para que todo el mundo pueda instalarla y utilizarla?
En este artículo vamos a crear una librería de python y utilizaremos una adaptación del código que programé para extraer información de ficheros PDF de la CNMV:
1. Estructura de una librería de Python
Básicamente necesitaremos crear las siguientes carpetas y ficheros:
En nuestro caso particular vamos a llamar a la librería “Leer_PDF” y vamos a crear esta estructura de carpetas y ficheros (sin código todavía):
Vamos a ver rápidamente qué debe incluir cada archivo:
- Funciones.py : fichero que llamaremos como nos de la gana y donde se incluirán las funciones que luego pueden importarse
- __init__.py : fichero gracias al cual Python interpreta que está delante de una librería. Puede estar en blanco, sin código
- setup.py : instrucciones para poder instalar nuestra librería, como por ejemplo, requisitos previos de instalación de otras librerías
- README.md : fichero en formato Markdown en el que incluiremos información sobre nuestra librería (es opcional)
2. Código de los ficheros
Vamos a empezar a escribir el código dentro de cada fichero
2.1. Funciones.py
En este archivo incluiremos todas aquellas librerías que son necesarias importar para que funcione nuestras nuevas funciones (como pandas, numpy, etc) y las propias funciones que nosotros vamos a definir.
En este ejemplo sencillo lo único que vamos a definir es una función “leer_pdf” al cual le enviaremos el path de un fichero y tratará de leer el contenido. Si no encuentra ningún error, imprimirá el resultado. En caso contrario no pasará nada.
Vemos el código:
>>import fitz #librería pymupdf |
|
>> def leer_pdf(path): |
>> try: |
>> with fitz.open(path) as file: |
>> text = '' |
>> for page in file: |
>> text += page.getText() |
>> print(text) |
>> except: |
2.2. __init__.py
Este fichero lo podemos dejar en blanco. Si lo dejamos en blanco, a la hora de utilizar nuestra función en Python deberemos invocarla así:
No es una manera muy elegante de invocar a nuestra función. Si queremos simplificarlo simplemente incluiremos en el fichero __init__.py las siguientes líneas de código:
>>from .Funciones import leer_pdf
Ahora sí que cualquiera que utilice nuestra librería podrá invocar a la función
de la siguiente manera:
>>from Leer_PDF import leer_pdf
Nota2: es muy IMPORTANTE incluir la ruta relativa del fichero. En este caso, Funciones.py está en el mismo directorio que __init__.py por lo que solo tenemos que añadir un punto delante del nombre
2.3. setup.py
Quizás este sea el documento más “complejo”, pero nada del otro mundo. Una configuración básica de este fichero sería:
>>import pathlib
>>from setuptools import find_packages, setup |
|
>>HERE = pathlib.Path(__file__).parent |
|
>>VERSION = '0.0.1' #Muy importante, deberéis ir cambiando la versión de vuestra librería según incluyáis nuevas funcionalidades |
>>PACKAGE_NAME = 'Leer_PDF' #Debe coincidir con el nombre de la carpeta |
>>AUTHOR = 'Antonio Fernandez Troyano' #Modificar con vuestros datos |
>>AUTHOR_EMAIL = 'a.fernandez.troyano@gmail.com' #Modificar con vuestros datos |
>>URL = 'https://github.com/afernandez119' #Modificar con vuestros datos |
|
>>LICENSE = 'MIT' #Tipo de licencia |
>>DESCRIPTION = 'Librería para leer ficheros PDFs y extraer la información en formato str' >>#Descripción corta |
>>LONG_DESCRIPTION = (HERE / "README.md").read_text(encoding='utf-8') #Referencia al documento README con una descripción más elaborada |
>>LONG_DESC_TYPE = "text/markdown" |
|
|
>>#Paquetes necesarios para que funcione la libreía. Se instalarán a la vez si no lo tuvieras ya instalado |
>>INSTALL_REQUIRES = [ |
>>'pymupdf' |
>>] |
|
>>setup ( |
>> name=PACKAGE_NAME, |
>> version=VERSION, |
>> description=DESCRIPTION, |
>> long_description=LONG_DESCRIPTION, |
>> long_description_content_type=LONG_DESC_TYPE, |
>> author=AUTHOR, |
>> author_email=AUTHOR_EMAIL, |
>> url=URL, |
>> install_requires=INSTALL_REQUIRES, |
>> license=LICENSE, |
>> packages=find_packages(), |
>> include_package_data=True |
Los campos más importantes serían:
2.4. README.mdSimplemente se trata de un documento en formato Markdown donde se debe describir para qué sirve nuestra librería, formas de utilizarlo, etc. Un ejemplo sencillo y básico de un fichero README.md para nuestra librería “leer_pdf” podría ser: |
|
Librería leer PDFs
Por Antonio Fernández Troyano - https://www.fernandeztroyano.es
Librería que te permite extraer el texto contenido en un fichero PDF.
Para utilizarlo simplemente necesitas incluir la ruta del fichero y te imprimirá el contenido del mismo en formato texto.
💡 Prerequisitos
📚 Ejemplo de uso
from leer_PDF import leer_pdf
leer_pdf('.\Documento.pdf')
🐸 Aloha!
3. Publicar nuestra librería de Python en internet
Si hemos seguido los pasos, tendremos un carpeta con los siguientes ficheros y los códigos del apartado 2.
¿Qué es lo siguiente? publicar nuestra librería en internet para que todo el mundo pueda acceder a la misma.
3.1. Empaquetado de la librería y creación de los ficheros dist (distribution packages)
Ahora que ya tenemos todos los ficheros, tendremos que empaquetar nuestra librería para poder subirla al repositorio PyPI y que todo el mundo pueda descargarla.
Para ello primeros ejecutaremos el fichero setup.py en la consola de Linux o a través de la línea de comandos de Visual Studio Code si estás en Windows, por ejemplo:
python setup.py sdist bdist_wheel
Si todo va bien se os creará una nueva carpeta llamada “dist” que contendrá la librería empaquetada lista para su distribución
3.2. Publicar librería en PyPI y PyPI test
Ahora que ya tenemos empaquetada nuestra librería solo nos quedará publicarla en algún repositorio online, como PyPI.
Antes de colgarla en abierto para todo el mundo, es conveniente realizar una primera prueba en PyPI test y cuando estemos seguros lo publicamos en PyPI.
Requisitos:
- Crearse una cuenta en PyPI test — https://test.pypi.org/
- Crearse una cuenta en PyPI — https://pypi.org/
- Instalar la librería twine — pip install twine
a) Primera publicación en PyPI test:
Básicamente se trata de subir los ficheros mediante twine:
twine upload --repository testpypi dist/Leer_PDF-0.0.1.tar.gz dist/Leer_PDF-0.0.1-py3-none-any.whl
Introducimos nuestro usuario y contraseña y si todo va bien…
Ahora podemos verificar que se ha instalado correctamente mediante Google Colab, por ejemplo:
b) Publicación definitiva en PyPI:
Si ya habéis probado en a subir vuestra librería en PyPI test y funciona, es hora de cargar vuestra librería en PyPI:
twine upload dist/Leer_PDF-0.0.1.tar.gz dist/Leer_PDF-0.0.1-py3-none-any.whl
¡Y listo!