2010-11-11 11 views
19

Por favor, muestran la sencilla y hasta la fecha forma estándar para crear un paquete de Python para Python 2.xCómo crear un paquete de Python 2.x - simple caso

preferiría utilizar pip para instalar el paquete luego.

El paquete debe contener una sola clase:

class hello: 
    def greet(self): 
    print "hello" 

Uno debe ser capaz de hacer lo siguiente después:

pip install my_package-0.1.1.... 

Y después de usarlo:

from my_package import hello 

h = hello.hello() 
h.greet() 

Lo que estoy pidiendo es:

  • La estructura de directorios y archivos
  • contenido de los archivos
  • comando para crear el archivo del paquete distribuible
  • comando para instalar el paquete desde el archivo del paquete distribuible (utilizando preferentemente PIP)

Hay son varios los howtos que encontré pero todavía no estoy seguro de cómo se manejaría este caso muy simple y simplificado (sin paquetes anidados, eliminación de todos los archivos y características que pueden omitirse para el caso más simple) y cuál es la forma moderna para hacerlo.

Me gustaría que esta pregunta ingrese al estado wiki comunitario, por lo que no obtendrá ningún punto y daré suficiente tiempo y marcaré una respuesta aceptada después de varios días, también teniendo en cuenta los votos y los comentarios.

Editar:

que tienen un primer ejemplo de ejecución que quiero compartir, que utiliza la respuesta de Marius Gedminas por ello. No contiene todo lo que debería estar allí, pero funciona, por lo que puede demostrar el núcleo del proceso técnico. Para agregar más partes necesarias, lea la respuesta de Marius a continuación.

estructura de directorios:

MyProject/ 
    setup.py 
    my_package.py 
    README.txt 
    MANIFEST.in 

setup.py:

from setuptools.import setup 
setup(name='MyProject', 
     version='0.1', 
     py_modules=['my_package']) 

my_package.py:

class hello: 
    def greet(self): 
    print "hello" 

MANIFEST.in:

include *.txt 

para crear el paquete de esta carpeta, vaya a la carpeta y ejecutar MiProyecto:

$ python setup.py sdist 

Esto creará un archivo MyProject-0.1.tar.gz en una subcarpeta dist/. Copie este archivo a una carpeta en la máquina de destino.

En el equipo de destino ejecuta este comando en la carpeta que contiene MyProject-0.1.tar.gz:

sudo pip install MyProject-0.1.tar.gz 

Puede ser necesario cerrar la sesión y volver a iniciar sesión en la máquina objetivo ahora, para que se encontrará el paquete. Después se puede probar el paquete en el equipo de destino utilizando el intérprete de Python:

$ python 
>>> import my_package 
>>> h = my_package.hello() 
>>> h.greet() 
hello 
>>> 

Una vez que esto funciona por favor, no olvide añadirlo a los otros contenidos necesarios, véase la respuesta de Marius a continuación.

+0

El objetivo de esta pregunta es para elegir un enfoque moderno y luego quitar casi todo lo que se puede quitar para que funcione. – mit

Respuesta

32

de inicio sencilla

más simple paquete de un solo archivo:

MyProject/ 
    setup.py 
    my_package.py 

más simple setup.py:

from setuptools import setup 
setup(name='MyProject', 
     version='0.1', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     py_modules=['my_package']) 

Inclusión de archivos adicionales en el paquete

Siguiente probablemente debería añadir un README:

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package.py 

Nota del nuevo archivo - MANIFEST.in.En él se especifica que los archivos no Python deben ser incluidos en su distribución de fuentes:

include *.rst 

La gente te dirá "Oh, se salta el manifiesto, sólo tiene que añadir los archivos de control de código fuente, setuptools los encontrarán". Ignora ese consejo, es demasiado propenso a errores.

Hacer la página PyPI útil

Es útil para hacer el README.rst disponible para la gente para ver en línea, en el índice de paquetes de Python. Así que cambiar su setup.py hacer

from setuptools import setup 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     ... 
     description='Example package that says hello', 
     long_description=readme, 
     ...) 

Uso ReStructuredText marcado para las páginas más bonitas. Utilice

python setup.py --long-description | rst2html 

para atrapar errores ReStructuredText temprano.

más de un módulo Python en un paquete

Un archivo no será lo suficientemente pronto, por lo que el cambio a un paquete (confundiendo la advertencia terminología: paquete de Python como en un directorio con un __init__ py, no como en un distribuible autónomo de archivo):

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package/ 
     __init__.py 
     some_module.py 

y cambiar setup.py a

from setuptools import setup, find_packages 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     version='0.2', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     long_description=readme, 
     packages=find_packages()) 

Liberar al público

Get a PyPI account - solo tiene que hacer esto una vez.

Para hacer un lanzamiento, asegúrese de que el número de versión en setup.py es correcta, a continuación, ejecute

python setup.py sdist register upload 

Eso es todo.

Decir a la gente para instalarlo

Diles que

pip install MyProject 

(mismo nombre que ha especificado en setup.py como argumento name de configuración())

+2

Estoy haciendo la pregunta sobre "lo más simple" aquí. Si bien estoy absolutamente de acuerdo en que es importante comenzar de manera simple, con el tiempo debe crecer. Cuando eso sucede, la ruta de crecimiento debe ser clara. –

+0

¡Realmente increíble, muchas gracias! – mit

+3

Creo que ha encontrado un buen equilibrio entre simple y también incluye los extras más esenciales. – mit

4

Lo siguiente se copió del Distutils Tutorial.

diseño del archivo:

top 
|-- package 
| |-- __init__.py 
| |-- module.py 
| `-- things 
|  |-- cross.png 
|  |-- fplogo.png 
|  `-- tick.png 
|-- runner 
|-- MANIFEST.in 
|-- README 
`-- setup.py 

Para hacer que el archivo comprimido de instalación, simplemente ejecute:

python setup.py sdist 

Para instalar el paquete, utilice pip o easy_install:

pip install my_package-1.2.3.tar.bz2 

o

easy_install my_package-1.2.3.tar.bz2 

Además, puede subirlo a PyPI, primero registrarlo:

python setup.py register 

a continuación, cargar el archivo fuente

python setup.py sdist upload 

Puede cargar los huevos binarios también (aunque no es necesario):

python setup.py bdist_egg upload 

Entonces la gente puede instalarlo así:

pip install my_package==1.2.3 

o,

easy_install my_package==1.2.3 
+0

@mit ah bien; si quiere mantener el mínimo, '__import __ ('setuptools'). setup (name = 'myapp')' es suficiente :) –

+0

Cargar bdist_eggs no es solo innecesario sino que puede ser activamente nocivo. Solo hazlo si estás creando un paquete para Windows que necesita un compilador de C para instalarlo. –

+0

@Marius Gedminas ¿puedes citar tu fuente sobre la nocividad de los huevos? No los uso mucho, pero pueden ser útiles para personas sin bibliotecas de desarrollo instaladas (si el paquete tiene extensiones C). En cuanto a Windows, 'bdist_wininst' podría funcionar mejor, ya que también funciona como un huevo (' easy_install' y 'pip' pueden descomprimirlo), pero permite a los usuarios instalar también a través de la interfaz GUI. –

Cuestiones relacionadas