SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
PyConES 2013

Empaquetar es fácil,
si sabes cómo
Juan Luis Cano, @Pybonacci
Madrid, 2013-11-24
Situación común:
Código que se quiere compartir
(Proyecto PyFoo)
$ tree pyfoo/
pyfoo/
├── awesomic packgraphic.py
├── hejemplos de ayuda.py
├── notas.doc
├── Notas_v2.doc
├── PyFoo Drivers Retrastic.py
└── PyFooMaster Class.py
$ tree pyfoo/
pyfoo/
├── awesomic packgraphic.py
├── hejemplos de ayuda.py
├── notas.doc
├── Notas_v2.doc
├── PyFoo Drivers Retrastic.py
└── PyFooMaster Class.py
Problemas comunes
●

Ausencia de notas de instalación*

●

Archivos sin ningún tipo de jerarquía

●

Ausencia de tests o documentación

●

¿?

*Lo de usar .doc no es tan común, afortunadamente
†Y lo de las faltas de ortografía tampoco
¿De qué va esta charla?
●

●

Cómo organizar el código de mi paquete
Cómo hacerlo fácilmente instalable
(por otros)

●

Cómo incluir tests y documentación

●

Cómo distribuirlo

●

Trucos extra
Jerarquía
●

Es importante ser predecible

$ tree pyfoo
pyfoo
├── COPYING
├── doc
├── pyfoo
├── README.rst
├── setup.py
└── test
Jerarquía
●

●

●

Siempre necesitamos un README(.rst)
Siempre* necesitamos una licencia: COPYING,
LICENSE
Directorios:
–
–

doc: documentación

–
●

pyfoo: código del paquete
test: tests

De setup.py hablaremos luego

*Consulte legislación acerca de derechos de autor correspondiente
Truco: ¡Estudia el código de gente
más lista que tú!*

*¡A ver cómo te crees que hemos aprendido todos!
Paquetes y módulos
●

Módulos: archivos .py

●

Contienen todas las definiciones

●

Nombres cortos y en minúsculas (PEP 8)

●

Evitar guiones bajos _ en lo posible

●

Módulo = Unidad lógica
Paquetes y módulos

●

Paquetes: grupos de módulos bajo un
espacio de nombres

●

Cualquier directorio con __init__.py

●

Fundamentales para categorizar módulos
Paquetes y módulos
Ejemplo de Celery (https://github.com/celery/celery)
$ tree celery/
celery/
└── celery
└── backends
├── amqp.py
├── base.py
├── __init__.py
├── mongodb.py
├── [...]
└── redis.py
Paquetes y módulos
Ejemplo de Celery (https://github.com/celery/celery)
$ python
>>> import celery.backends.mongodb
>>> from celery.backends import mongodb
Los paquetes me crean un espacio de nombres
Paquetes FAQ
●

¿Qué es __init__.py?

Respuesta: código que se ejecuta al importar el paquete
$ cat pyfoo/backends/__init__.py
print("Hello, " + __package__)
$ python -q
>>> from pyfoo.backends import base
Hello, pyfoo.backends
>>> from pyfoo.backends import redis
>>>
Paquetes FAQ
●

¿Qué debo poner en __init__.py?

Respuesta: nada (o, en general, poco). Pero...
>>> import pyfoo.backends
Hello, pyfoo.backends
>>> pyfoo.backends.base
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute
'base'
Paquetes FAQ
A veces conviene:
$ cat pyfoo/backends/__init__.py
from . import base
from . import mongodb
$ python -q
>>> import pyfoo.backends
>>> pyfoo.backends.base
<module 'pyfoo.backends.base' from
'./pyfoo/backends/base.py'>
Distribuir tu paquete

distutils, setuptools, distribute, easy_install...
¡Olvida todo lo que sabes hasta ahora!
Distribuir tu paquete
Preparando tu paquete
●

distutils: biblioteca estándar, básico

●

setuptools: extiende y mejora distutils

●

pip: instalador de paquetes

●

●

PEP 453: ¡pip en la biblioteca estándar en
Python 3.4!
pip depende de setuptools... de momento
El archivo setup.py
from distutils.core import setup
setup(name="pyfoo", version="0.1",
summary=open(“README.rst”).read(),
author="Juan Luis Cano",
author_email="juanlu001@gmail.com",
license="BSD",
url="http://foopy.github.io",
packages=["foopy"])
Instalando

$ python setup.py install
¡Importante!

Nunca, nunca, nunca, nunca
usar sudo con pip o setup.py install
Referencias: [1] [2] [3] [4]
¡Importante!
En su lugar:
$ python setup.py install --user
$ pip install --user
Dependencias
Primer método: install_requires
from setuptools import setup
setup(name="pyfoo", version="0.1", # ...
install_requires=[
"django", "requests"])
Dependencias
Segundo método: requirements.txt
$ cat requirements.txt
Django==1.5
requests>=1.0
Dependencias
●

●

●

¡Los métodos son diferentes!
install_requires: «dependencias
abstractas», bibliotecas
requirements.txt: «dependencias
concretas», aplicaciones, por defecto de PyPI
Últimos preparativos
●

●

El archivo MANIFEST.in sirve para añadir archivos
extra
En nuestro caso:

$ cat MANIFEST.in
include *.rst COPYING
●

Otros comandos: exclude, recursive-include, ...
Subiendo a PyPI
●

Creamos distribución de código fuente y la
subimos:

$ python setup.py sdist
$ python setup.py register
$ python setup.py sdist upload
¡Listo! :)
El futuro
●

Python 3.4 incorporará pip

●

Numerosas mejoras y se sigue trabajando

●

Formato wheel (¿presente?)
http://pythonwheels.com/
¿Preguntas?
Muchas gracias
y hasta el año que viene :)
@Pybonacci
http://pybonacci.wordpress.com/

●

●

●

https://hynek.me/articles/sharing-your-labor-of-love-pypiquick-and-dirty/
http://www.jeffknupp.com/blog/2013/08/16/open-sourcing-apython-project-the-right-way/
https://python-packaging-userguide.readthedocs.org/en/latest/current.html

Mais conteúdo relacionado

Semelhante a Empaquetar es fácil, si sabes cómo

Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Usando Django con Docker
Usando Django con DockerUsando Django con Docker
Usando Django con DockerErnesto Crespo
 
Plone Gobierno
Plone GobiernoPlone Gobierno
Plone Gobiernoajussis
 
Instalacion pingüino
Instalacion pingüinoInstalacion pingüino
Instalacion pingüinoberthin
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mariano Reingart
 
Buildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonBuildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonCodeSyntax
 
Cómo crear ports en FreeBSD #PicnicCode2015
Cómo crear ports en FreeBSD #PicnicCode2015Cómo crear ports en FreeBSD #PicnicCode2015
Cómo crear ports en FreeBSD #PicnicCode2015OpenSistemas
 
Empaquetar un paquete Debian por medio de mercurial
Empaquetar un paquete Debian por medio de mercurialEmpaquetar un paquete Debian por medio de mercurial
Empaquetar un paquete Debian por medio de mercurialErnesto Crespo
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispanohdgarcia
 
Masterclass ADWE Madrid
Masterclass ADWE MadridMasterclass ADWE Madrid
Masterclass ADWE MadridKubide
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsDavid Ballén
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytestHector Canto
 
201595533 maestrosdelweb-curso-django-1-pdf
201595533 maestrosdelweb-curso-django-1-pdf201595533 maestrosdelweb-curso-django-1-pdf
201595533 maestrosdelweb-curso-django-1-pdfGalvi Yanez
 
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...Guillermo Pizarro
 
Distribucion_aplicaciones
Distribucion_aplicacionesDistribucion_aplicaciones
Distribucion_aplicacionesJuanjo Marin
 

Semelhante a Empaquetar es fácil, si sabes cómo (20)

Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Usando Django con Docker
Usando Django con DockerUsando Django con Docker
Usando Django con Docker
 
Plone Gobierno
Plone GobiernoPlone Gobierno
Plone Gobierno
 
Practica 5
Practica 5Practica 5
Practica 5
 
Instalacion pingüino
Instalacion pingüinoInstalacion pingüino
Instalacion pingüino
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015
 
Primeros Pasos en PyQt4
Primeros Pasos en PyQt4Primeros Pasos en PyQt4
Primeros Pasos en PyQt4
 
Buildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonBuildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en Python
 
Cómo crear ports en FreeBSD #PicnicCode2015
Cómo crear ports en FreeBSD #PicnicCode2015Cómo crear ports en FreeBSD #PicnicCode2015
Cómo crear ports en FreeBSD #PicnicCode2015
 
Empaquetar un paquete Debian por medio de mercurial
Empaquetar un paquete Debian por medio de mercurialEmpaquetar un paquete Debian por medio de mercurial
Empaquetar un paquete Debian por medio de mercurial
 
Tutorial C++
Tutorial C++Tutorial C++
Tutorial C++
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
 
Masterclass ADWE Madrid
Masterclass ADWE MadridMasterclass ADWE Madrid
Masterclass ADWE Madrid
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para Frontends
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Código Bonito con PHP
Código Bonito con PHPCódigo Bonito con PHP
Código Bonito con PHP
 
201595533 maestrosdelweb-curso-django-1-pdf
201595533 maestrosdelweb-curso-django-1-pdf201595533 maestrosdelweb-curso-django-1-pdf
201595533 maestrosdelweb-curso-django-1-pdf
 
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...
Cómo instalar un Servidor GIS utilizando el Framework GeoDjango (Django+Post...
 
Distribucion_aplicaciones
Distribucion_aplicacionesDistribucion_aplicaciones
Distribucion_aplicaciones
 

Último

infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxinfor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxgustavovasquezv56
 
Editorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfEditorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfYanitza28
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte2024020140
 
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxNIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxDaniloDaz4
 
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxTarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxVICTORMANUELBEASAGUI
 
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfJosAndrRosarioVzquez
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfYanitza28
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxJOELGARCIA849853
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaRicardoEstrada90
 
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfpresentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfaxelv9257
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptxdulcemonterroza
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionEmanuelMuoz11
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaJadeVilcscordova
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosYOMIRAVILLARREAL1
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...axelv9257
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8antoniopalmieriluna
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdfjuan23xpx
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxcj12paz
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaEdwinGarca59
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024NicolleAndrade7
 

Último (20)

infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxinfor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
 
Editorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfEditorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdf
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte
 
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxNIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
 
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxTarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
 
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdf
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - Estrada
 
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfpresentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacion
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el tema
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de Datos
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptx
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación Latinoamerica
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024
 

Empaquetar es fácil, si sabes cómo

  • 1. PyConES 2013 Empaquetar es fácil, si sabes cómo Juan Luis Cano, @Pybonacci Madrid, 2013-11-24
  • 2. Situación común: Código que se quiere compartir (Proyecto PyFoo)
  • 3. $ tree pyfoo/ pyfoo/ ├── awesomic packgraphic.py ├── hejemplos de ayuda.py ├── notas.doc ├── Notas_v2.doc ├── PyFoo Drivers Retrastic.py └── PyFooMaster Class.py
  • 4. $ tree pyfoo/ pyfoo/ ├── awesomic packgraphic.py ├── hejemplos de ayuda.py ├── notas.doc ├── Notas_v2.doc ├── PyFoo Drivers Retrastic.py └── PyFooMaster Class.py
  • 5.
  • 6. Problemas comunes ● Ausencia de notas de instalación* ● Archivos sin ningún tipo de jerarquía ● Ausencia de tests o documentación ● ¿? *Lo de usar .doc no es tan común, afortunadamente †Y lo de las faltas de ortografía tampoco
  • 7. ¿De qué va esta charla? ● ● Cómo organizar el código de mi paquete Cómo hacerlo fácilmente instalable (por otros) ● Cómo incluir tests y documentación ● Cómo distribuirlo ● Trucos extra
  • 8. Jerarquía ● Es importante ser predecible $ tree pyfoo pyfoo ├── COPYING ├── doc ├── pyfoo ├── README.rst ├── setup.py └── test
  • 9. Jerarquía ● ● ● Siempre necesitamos un README(.rst) Siempre* necesitamos una licencia: COPYING, LICENSE Directorios: – – doc: documentación – ● pyfoo: código del paquete test: tests De setup.py hablaremos luego *Consulte legislación acerca de derechos de autor correspondiente
  • 10. Truco: ¡Estudia el código de gente más lista que tú!* *¡A ver cómo te crees que hemos aprendido todos!
  • 11. Paquetes y módulos ● Módulos: archivos .py ● Contienen todas las definiciones ● Nombres cortos y en minúsculas (PEP 8) ● Evitar guiones bajos _ en lo posible ● Módulo = Unidad lógica
  • 12. Paquetes y módulos ● Paquetes: grupos de módulos bajo un espacio de nombres ● Cualquier directorio con __init__.py ● Fundamentales para categorizar módulos
  • 13. Paquetes y módulos Ejemplo de Celery (https://github.com/celery/celery) $ tree celery/ celery/ └── celery └── backends ├── amqp.py ├── base.py ├── __init__.py ├── mongodb.py ├── [...] └── redis.py
  • 14. Paquetes y módulos Ejemplo de Celery (https://github.com/celery/celery) $ python >>> import celery.backends.mongodb >>> from celery.backends import mongodb Los paquetes me crean un espacio de nombres
  • 15. Paquetes FAQ ● ¿Qué es __init__.py? Respuesta: código que se ejecuta al importar el paquete $ cat pyfoo/backends/__init__.py print("Hello, " + __package__) $ python -q >>> from pyfoo.backends import base Hello, pyfoo.backends >>> from pyfoo.backends import redis >>>
  • 16. Paquetes FAQ ● ¿Qué debo poner en __init__.py? Respuesta: nada (o, en general, poco). Pero... >>> import pyfoo.backends Hello, pyfoo.backends >>> pyfoo.backends.base Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute 'base'
  • 17. Paquetes FAQ A veces conviene: $ cat pyfoo/backends/__init__.py from . import base from . import mongodb $ python -q >>> import pyfoo.backends >>> pyfoo.backends.base <module 'pyfoo.backends.base' from './pyfoo/backends/base.py'>
  • 18. Distribuir tu paquete distutils, setuptools, distribute, easy_install... ¡Olvida todo lo que sabes hasta ahora!
  • 20. Preparando tu paquete ● distutils: biblioteca estándar, básico ● setuptools: extiende y mejora distutils ● pip: instalador de paquetes ● ● PEP 453: ¡pip en la biblioteca estándar en Python 3.4! pip depende de setuptools... de momento
  • 21. El archivo setup.py from distutils.core import setup setup(name="pyfoo", version="0.1", summary=open(“README.rst”).read(), author="Juan Luis Cano", author_email="juanlu001@gmail.com", license="BSD", url="http://foopy.github.io", packages=["foopy"])
  • 23. ¡Importante! Nunca, nunca, nunca, nunca usar sudo con pip o setup.py install Referencias: [1] [2] [3] [4]
  • 24. ¡Importante! En su lugar: $ python setup.py install --user $ pip install --user
  • 25. Dependencias Primer método: install_requires from setuptools import setup setup(name="pyfoo", version="0.1", # ... install_requires=[ "django", "requests"])
  • 26. Dependencias Segundo método: requirements.txt $ cat requirements.txt Django==1.5 requests>=1.0
  • 27. Dependencias ● ● ● ¡Los métodos son diferentes! install_requires: «dependencias abstractas», bibliotecas requirements.txt: «dependencias concretas», aplicaciones, por defecto de PyPI
  • 28. Últimos preparativos ● ● El archivo MANIFEST.in sirve para añadir archivos extra En nuestro caso: $ cat MANIFEST.in include *.rst COPYING ● Otros comandos: exclude, recursive-include, ...
  • 29. Subiendo a PyPI ● Creamos distribución de código fuente y la subimos: $ python setup.py sdist $ python setup.py register $ python setup.py sdist upload ¡Listo! :)
  • 30. El futuro ● Python 3.4 incorporará pip ● Numerosas mejoras y se sigue trabajando ● Formato wheel (¿presente?) http://pythonwheels.com/
  • 32. Muchas gracias y hasta el año que viene :) @Pybonacci http://pybonacci.wordpress.com/ ● ● ● https://hynek.me/articles/sharing-your-labor-of-love-pypiquick-and-dirty/ http://www.jeffknupp.com/blog/2013/08/16/open-sourcing-apython-project-the-right-way/ https://python-packaging-userguide.readthedocs.org/en/latest/current.html