SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
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

Más contenido relacionado

Similar 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
 

Similar 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

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 

Último (11)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 

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