2012-02-17 10 views
7

? Nuestra es una tienda de pitones. Tenemos diferentes paquetes de python desarrollados internamente y se implementarán en los entornos de los clientes (máquinas).¿Cuáles son las mejores prácticas para crear distribuciones de Python (huevecillos) en (y para) múltiples sistemas operativos

Así es como ocurre nuestro ciclo de desarrollo y lanzamiento.

Una vez que los desarrolladores completan las "pruebas" de un paquete, se prepara una distribución (archivo huevo) del paquete y se envía a un archivo central. Cuando deseamos implementar nuestro software en Customers, las mismas distribuciones (archivos egg) se descargarán e instalarán en su entorno.

Suponiendo que la "prueba" ocurre en múltiples sistemas operativos (para verificar la compatibilidad de la API entre plataformas), ¿cuál es la mejor práctica para preparar distribuciones y enviarla al archivo central?

¿Es mejor tener huevos específicos del sistema operativo en el servidor de archivado (como, samplepkg-1.0.0.win32.egg y samplepkg-1.0.0.linux.egg? No estoy seguro de cómo se pueden preparar de esta manera usando setuptools.) ¿O tener un solo huevo porque API permanece igual en todas las plataformas? ¿Alguna otra práctica que sea seguida por la comunidad?

Respuesta

5

Se puede utilizar un solo paquete si:

  1. El paquete no utiliza funciones/clases que no están disponibles en todas las plataformas de destino (véase por ejemplo, los capítulos 36-39 de la referencia de la biblioteca de Python para la versión estándar 2.7.2 para cosas que no debe usar en ese caso)
  2. No está utilizando extensiones escritas en C/C++ que deben compilarse para cada plataforma.

En general, es una buena idea mantenerse alejado de las funciones específicas del sistema operativo que no están disponibles en todas sus plataformas de destino. La biblioteca estándar está bastante bien documentada en ese sentido.

2

Creo que en este caso, usar un solo paquete sería más complicado debido a las razones que Roland mencionó anteriormente. En su entorno de desarrollo podría tener carpetas separadas para plataformas separadas, cada una con el código específico de la plataforma (como extensiones/bibliotecas escritas en C/C++). Necesitarías imitar tus herramientas de configuración dentro de estas carpetas para producir huevos separados, pero finalmente sería menos complejo (creo, sin saber más sobre qué código estás trabajando en realidad) que tratar de poner todo en un solo paquete.

En cualquier caso, leer la documentación en la biblioteca estándar, así como distutils (http://docs.python.org/distutils/) debería ayudarlo a encontrar su solución.

1

Los huevos específicos de la plataforma solo están destinados a la distribución de paquetes que contienen código C; de lo contrario, los archivos de huevo en sí mismos son independientes de la plataforma y solo necesita distribuir un huevo independiente de la plataforma.

Si está utilizando herramientas de instalación automatizadas o pkg_resources 'runtime API para buscar bibliotecas y complementos, puede simplemente volcar todos los huevos en un solo directorio, y la herramienta de instalación o API de tiempo de ejecución elegirá qué huevo instalar o importar de.

tl; versión dr: la forma en que setuptools construye huevos es la forma en que deberían distribuirse; si intentas convertir un huevo multiplataforma en uno dependiente de la plataforma o viceversa, es probable que experimentes algo de dolor.;-)

0

Si solo tiene módulos de python, mantenga toda la diferencia oculta en python, ya sea los mismos archivos (python std lib) o archivos separados (pyserial).

Si tiene módulos compilados, es un poco más complicado.

utilizo la siguiente estructura de directorios para un proyecto que necesita ser compilado extensión:

./lib/display.py # frontend, platform-independent 
./lib.linux-x86_64-2.6/_display.so 
./lib.linux-armv5tejl-2.6/_display.so 

Y este código en el comienzo del comienzo del programa:

sys.path.append("lib.%s-%s-%s.%s" % ((posix.uname()[0].lower(), 
             posix.uname()[4]) 
            +sys.version_info[:2])) 

se puede envolver estructura como esto en un .egg también, siempre y cuando especifiques que no es zip-safe.

Cuestiones relacionadas