2010-03-08 14 views
17

Tengo un módulo de Python que me gustaría cargar a PyPI. Hasta ahora, está funcionando para Python 2.x. No debería ser demasiado difícil escribir una versión para 3.x ahora.Cómo organizar los módulos de Python para que PyPI sea compatible con 2.x y 3.x

Pero, después de seguir las directrices para la toma de módulos en estos lugares:

no me queda claro cómo apoyar múltiples distribuciones de código fuente para las diferentes versiones de Python, y no está claro si/cómo PyPI podría soportarlo. Me prever que tendría código separado para:

  • 2.x
  • 2.6 (tal vez, como un caso especial para utilizar la nueva API de búfer)
  • 3.x

¿Cómo es es posible configurar un módulo de Python en PyPI para que alguien pueda hacer:

easy_install modulename 

y se instalará lo correcto si el usuario está utilizando 2.xo 3.x?

+0

'easy_install' no funciona para Python 3.x – jfs

+0

¿Qué' pip' entonces? –

+1

La versión Distribuir de 'easy_install' funciona para Python 3.x (http://pypi.python.org/pypi/distribute). –

Respuesta

18

Encontré que setup.py for httplib2 parece tener una forma elegante de admitir Python 2.xy 3.x. Entonces decidí copiar ese método.

La tarea consiste en crear un único setup.py para la distribución de paquetes que funciona con todas las distribuciones admitidas de Python. Luego, con la misma setup.py, que puede hacer:

python2 setup.py install 

, así como

python3 setup.py install 

Debería ser posible mantener setup.py bastante simple que se consultará con todas las distribuciones de Python soportados. Lo he hecho con éxito con un paquete cobs que admite 2.4 a 2.6 y 3.1. Ese paquete incluye código puro de Python (código separado para Python 2.xy 3.x) y extensiones C, escritas por separado para 2.x y 3.x.

hacerlo:

1) puse el código Python 2.x en un subdirectorio python2, y el código Python 3.x en un subdirectorio python3.

2) pongo el código de extensión C para 2.xy 3.x en un directorio src bajo python2 y python3.

Por lo tanto, la estructura de directorios es:

root 
    | 
    +--python2 
    |  | 
    |  +--src 
    | 
    +--python3 
    |  | 
    |  +--src 
    | 
    +--setup.py 
    +--MANIFEST.in 

3) En el setup.py, que tenían estas líneas cerca de la parte superior:

if sys.version_info[0] == 2: 
    base_dir = 'python2' 
elif sys.version_info[0] == 3: 
    base_dir = 'python3' 

4) en la llamada a setup, he especificado el paquetes de forma normal:

setup(
    ... 
    packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ], 

5) Especifiqué el directorio base para t código que Python usando una opción package_dir (consulte el paso 3 para base_dir):

package_dir={ 
     'cobs' : base_dir + '/cobs', 
    }, 

6) para las extensiones C, I dio la ruta:

ext_modules=[ 
     Extension('cobs.cobs._cobs_ext', [ base_dir + '/src/_cobs_ext.c', ]), 
     Extension('cobs.cobsr._cobsr_ext', [ base_dir + '/src/_cobsr_ext.c', ]), 
    ], 

eso fue todo para setup.py. El archivo setup.py es analizable por Python 2.xy 3.x.

7) Por último, si se construye una distribución de código fuente usando:

python2 setup.py sdist 

continuación, lo hará por el tirón defecto en sólo los archivos que son específicamente necesarias para construir para que Python. P.ej. en el caso anterior, solo obtendría los archivos en python2 en la distribución de origen, pero no en los de python3. Pero para una distribución de fuente completa, desea incluir los archivos para 2.x y 3.x. Para ello, cree un archivo que contiene MANIFEST.in algo como esto:

include *.txt 
recursive-include python2 * 
recursive-include python3 * 

a ver lo que hice, ver el código fuente de cobsPyPI o BitBucket.

+0

No estoy seguro de por qué un escrito como este no se encuentra en alguna de las guías mencionadas anteriormente ni en ningún otro lugar que pueda encontrar para ese asunto. Acabo de subir mi primer paquete a pypi, fue escrito para py3 pero quiero admitir py2 de una manera lógica. Creo que esto ayudará. – Zeb

2

La solución más simple es usar una única fuente de distribución.

+0

podía hacer una sola distribución de código fuente , con directorios, por ejemplo 'python2' y' python3', cada uno con su propio 'setup.py' y el código del módulo para esa versión de Python. ¿Es eso lo que quieres decir? –

+0

Esta solución parece estar en conflicto con el consejo "Siempre se debe ejecutar el comando de instalación desde el directorio raíz de la distribución" en http://docs.python.org/3.1/install/index.html#platform-variations –

+1

@Craig McQueen : debería haber el único archivo 'setup.py'. Echar un vistazo a los paquetes que soportan tanto 2.xy 3.x en PyPI http://pypi.python.org/pypi?:action=browse&c=5&c=531&c=533 – jfs

Cuestiones relacionadas