() translation by (you can also view the original English article)
Los paquetes de Python te permiten desglosar sistemas grandes y organizar tus módulos de una manera consistente que tú y otras personas pueden usar y reutilizar de manera eficiente. El lema de Python de "Baterías incluidas" significa que viene precargado con muchos paquetes útiles en la biblioteca estándar.
Pero también hay muchos paquetes increíbles de terceros que puedes aprovechar. En este tutorial, aprenderás todo lo que necesitas saber sobre qué paquetes son exactamente, cómo importar módulos desde paquetes, explorar el paquete integrado en la biblioteca estándar de Python e instalar paquetes de terceros.
¿Qué son los paquetes?
Antes de que podamos hablar de los paquetes, hablemos de los módulos. Los módulos son los archivos de origen con extensión *.py donde tú (y todos los demás) ponen las funciones y clases que componen tu programa. Los paquetes son la manifestación del concepto de espacios de nombres jerárquicos de Python. Para citar el Zen de Python:
"Los espacios de nombres son una gran idea, ¡hagamos más de eso!"
Para ver todo el Zen de Python, escribe import this
en una sesión interactiva de Python:
1 |
import this |
2 |
|
3 |
The Zen of Python, by Tim Peters |
4 |
|
5 |
|
6 |
|
7 |
Beautiful is better than ugly. |
8 |
|
9 |
Explicit is better than implicit. |
10 |
|
11 |
Simple is better than complex. |
12 |
|
13 |
Complex is better than complicated. |
14 |
|
15 |
Flat is better than nested. |
16 |
|
17 |
Sparse is better than dense. |
18 |
|
19 |
Readability counts. |
20 |
|
21 |
Special cases aren't special enough to break the rules. |
22 |
|
23 |
Although practicality beats purity. |
24 |
|
25 |
Errors should never pass silently. |
26 |
|
27 |
Unless explicitly silenced. |
28 |
|
29 |
In the face of ambiguity, refuse the temptation to guess. |
30 |
|
31 |
There should be one-- and preferably only one --obvious way to do it. |
32 |
|
33 |
Although that way may not be obvious at first unless you're Dutch. |
34 |
|
35 |
Now is better than never. |
36 |
|
37 |
Although never is often better than *right* now. |
38 |
|
39 |
If the implementation is hard to explain, it's a bad idea. |
40 |
|
41 |
If the implementation is easy to explain, it may be a good idea. |
42 |
|
43 |
Namespaces are one honking great idea -- let's do more of those! |
Los espacios de nombres ayudan a organizar el código y evitar conflictos de nomenclatura. Esto es fundamental cuando varias personas trabajan juntas o cuando se utilizan paquetes desarrollados por otras personas.
Mientras que los paquetes representan una jerarquía de subpaquetes y módulos, que son archivos, la jerarquía no tiene que basarse en el sistema de archivos donde los paquetes y subpaquetes son directorios y subdirectorios. Es mucho más flexible que eso.
Paquete de ejemplo
Revisemos un paquete llamado "ansible". No es un paquete de la biblioteca estándar. Verás más adelante cómo buscar e instalar paquetes de terceros. Ahora, revisaremos la estructura de archivos del directorio.
Los paquetes se instalarán normalmente en el directorio de paquetes del sitio del intérprete de Python, que se ubicará en algún lugar (según la versión, el sistema operativo y la distribución) debajo de "lib". En el Mac, para Python 2.7 se ubicará en "<interpreter root>/lib/python2.7/site-packages". Así es como se organiza el paquete "ansible":
1 |
tree ansible -L 1
|
2 |
|
3 |
ansible |
4 |
|
5 |
├── __init__.py |
6 |
|
7 |
├── cli |
8 |
|
9 |
├── compat |
10 |
|
11 |
├── config |
12 |
|
13 |
├── constants.py |
14 |
|
15 |
├── errors |
16 |
|
17 |
├── executor |
18 |
|
19 |
├── galaxy |
20 |
|
21 |
├── inventory |
22 |
|
23 |
├── module_utils |
24 |
|
25 |
├── modules |
26 |
|
27 |
├── parsing |
28 |
|
29 |
├── playbook |
30 |
|
31 |
├── plugins |
32 |
|
33 |
├── template |
34 |
|
35 |
├── utils |
36 |
|
37 |
└── vars |
38 |
|
39 |
|
40 |
|
41 |
15 directories, 2 files |
42 |
Hay dos módulos y 15 directorios. Cada directorio es un subpaquete del paquete principal. Mirando dentro del directorio ansible/utils, podemos ver que contiene módulos adicionales e incluso un subpaquete más:
1 |
tree ansible/utils -L 1
|
2 |
|
3 |
ansible/utils |
4 |
|
5 |
├── __init__.py |
6 |
|
7 |
├── boolean.py |
8 |
|
9 |
├── cmd_functions.py |
10 |
|
11 |
├── color.py |
12 |
|
13 |
├── debug.py |
14 |
|
15 |
├── display.py |
16 |
|
17 |
├── encrypt.py |
18 |
|
19 |
├── hashing.py |
20 |
|
21 |
├── listify.py |
22 |
|
23 |
├── module_docs.py |
24 |
|
25 |
├── module_docs_fragments |
26 |
|
27 |
├── path.py |
28 |
|
29 |
├── shlex.py |
30 |
|
31 |
├── unicode.py |
32 |
|
33 |
└── vars.py |
34 |
|
35 |
|
36 |
|
37 |
1 directory, 14 files |
La ruta de búsqueda
Al importar un módulo, Python pasará por un algoritmo de búsqueda basado en la ruta de búsqueda, que es una lista de directorios para iniciar la búsqueda. La ruta de búsqueda es una lista de directorios disponibles a través de sys.path
y puedes manipularla dinámicamente (agregar, quitar o mover elementos en la ruta de búsqueda). El directorio de paquetes de sitio siempre está ahí.
Para importar el módulo path.py desde ansible/utils, deberás usar el siguiente comando:
import ansible.utils.path
Si también quieres usar el módulo estándar os.oath, usarás el siguiente comando:
import os.path
Ahora puedes utilizar uno o ambos módulos de ruta de acceso sin conflictos debido a la diferencia de espacio de nombres al que pertenecen.
Exploración de la biblioteca estándar
La biblioteca estándar tiene muchos paquetes. Vale la pena explorarlo siempre que necesites realizar alguna tarea y no estés seguro de cómo. Existe una probabilidad muy alta de que para cualquier tarea de propósito general como matemáticas, integración de shell, integración de sistema operativo, manipulación de cadenas, redes y formatos de archivo comunes, haya un paquete bien diseñado, de buen rendimiento y probado en la biblioteca estándar.
Realmente puedes confiar en los paquetes de bibliotecas estándar porque es muy importante ingresar a la biblioteca estándar. O bien el paquete fue diseñado por los desarrolladores principales de Python o fue muy revisado y a menudo muy utilizado en el campo como una biblioteca de terceros antes de convertirlo en la biblioteca estándar.
Estos son todos los paquetes de la biblioteca estándar organizados por tema.
PyPI
La biblioteca estándar es increíble, pero a menudo necesitarás alguna funcionalidad especial que no es estándar. No significa que tengas que escribirla desde cero. Python tiene una comunidad vibrante y activa que desarrolla y comparte libremente mucho código. Ingresa PyPI: el índice del paquetes de Python. PyPI aloja todos los paquetes disponibles públicamente y proporciona una ventanilla única para navegar a través de ellos.
Navegación por PyPI
PyPI organiza los paquetes en un índice navegable. Puedes navegar y buscar por tema, entorno, framework, desarrollo, estado, público objetivo, licencia, lenguaje natural, lenguaje de programación (sí, hay paquetes de Python que admiten muchos lenguajes de programación) y sistema operativo.
También hay una distinción entre los paquetes de Python 2 y Python 3, y puedes ver qué tan popular es un paquete por el número de descargas recientes. Por ejemplo, el paquete ansible está disponible en PyPI, y aquí están sus metadatos:
1 |
Downloads (All Versions): |
2 |
|
3 |
5528 downloads in the last day |
4 |
|
5 |
72037 downloads in the last week |
6 |
|
7 |
289967 downloads in the last month |
8 |
|
9 |
Author: Ansible, Inc. |
10 |
|
11 |
Home Page: https://ansible.com/ |
12 |
|
13 |
Bug Tracker: http://github.com/ansible/ansible/ |
14 |
|
15 |
License: GPLv3 |
16 |
|
17 |
Categories |
18 |
|
19 |
Development Status :: 5 - Production/Stable |
20 |
|
21 |
Environment :: Console |
22 |
|
23 |
Intended Audience :: Developers |
24 |
|
25 |
Intended Audience :: Information Technology |
26 |
|
27 |
Intended Audience :: System Administrators |
28 |
|
29 |
License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) |
30 |
|
31 |
Natural Language :: English |
32 |
|
33 |
Operating System :: POSIX |
34 |
|
35 |
Programming Language :: Python :: 2.6 |
36 |
|
37 |
Programming Language :: Python :: 2.7 |
38 |
|
39 |
Topic :: System :: Installation/Setup |
40 |
|
41 |
Topic :: System :: Systems Administration |
42 |
|
43 |
Topic :: Utilities |
44 |
|
45 |
Package Index Owner: James.Laska, jimi, ansible |
46 |
|
47 |
Package Index Maintainer: mpdehaan, badger |
48 |
|
49 |
DOAP record: ansible-2.0.0.2.xml |
50 |
Instalación de paquetes
Hay dos formas de instalar paquetes desde PyPI. Puedes descargar el paquete y luego ejecutar python setup.py install
. Pero la forma moderna es utilizar pip, setuptools y wheel. Pip son las siglas de Pip Installs Packages (sí, es una de esas siglas) y es tu interfaz para la instalación. Si tienes Python 2 >=2.7.9 o Python 3 >=3.4 instalado desde python.org, ya tendrás pip y setuptools, pero tendrás que actualizar a la última versión: pip install -U pip setuptools
o python -m pip install -U pip setuptools
en Windows.
Usa pip para instalar wheel: pip install wheel
.
Si usas una versión anterior de Python, considera la posibilidad de actualizar. Si no puedes hacerlo, deberás instalar pip, setuptools y wheel por tu cuenta. Consulta las instrucciones.
Los paquetes de Python siempre se instalan en un entorno. Una práctica común que no cubriré aquí es usar entornos virtuales para administrar múltiples instalaciones independientes de Python con diferentes intérpretes y/o diferentes conjuntos de paquetes instalados.
Mejores prácticas
La autoridad de empaquetado de Python proporciona mucha orientación sobre las mejores prácticas en torno al empaque. Esto es importante porque es un área de desarrollo activo y las recomendaciones evolucionan rápidamente.
Además, si quieres hacer algo especial como instalar paquetes desde repositorios alternativos en lugar de PyPI o usar pip de una manera más sofisticada, encontrarás excelentes discusiones y consejos prácticos.
Conclusión
Cuando eres un principiante de Python, aprendes el lenguaje principal y te diviertes jugando con él. Muy pronto, descubres la biblioteca estándar y, a medida que adquieres más experiencia, te beneficias cada vez más de su riqueza.
La siguiente etapa en tu evolución como Pythonista es incorporar la enorme maravilla que la comunidad de Python ha puesto en PyPI en tus sistemas. Los paquetes como la unidad de implementación de código Python reutilizable habilitan este ecosistema.