2011-04-21 6 views
8

Estoy desarrollando una aplicación utilizando Python 3. ¿Cuál es la mejor práctica para usar bibliotecas de terceros para el proceso de desarrollo y la distribución del usuario final? Tenga en cuenta que estoy trabajando dentro de estas restricciones:Práctica recomendada para agrupar bibliotecas de terceros para su distribución en Python 3

  • Los desarrolladores en el equipo deben tener la misma versión exacta de las bibliotecas.
  • Una solución ideal funcionaría tanto en Windows como en Linux.
  • Me gustaría evitar hacer que el usuario instale el software antes de usar el nuestro; es decir, no deberían tener que instalar el producto A y el producto B antes de usar el nuestro.
+0

que he tenido este problema apareció. Estaba construyendo un raytracer con Python, y confié en PIL para escribir imágenes. Rompió completamente mi raytracer cuando lo pasé a una Mac, ya que Apple no envía PIL con Mac OS. Si no usa mucho la biblioteca, considere deshacerse de ella y escriba su propia solución. – Blender

Respuesta

1

No hay mejores prácticas, pero hay algunas pistas diferentes que las personas siguen. Con respecto a distribución producto comercial se encuentran los siguientes:

administrar su propio paquete de servidores

con respecto a su proceso de desarrollo, es típico que o bien tienen su actualización de cajas dev desde un servidor local de paquetes . Eso le permite "congelar" la lista de dependencias (es decir, simplemente dejar de recibir actualizaciones de flujo ascendente) para que todos estén en la misma versión. Puede actualizar en determinados momentos y hacer que los desarrolladores también se actualicen, manteniendo a todos al mismo paso.

Para las instalaciones del cliente, generalmente se escribe una secuencia de comandos de instalación. Puede recopilar todos los paquetes e instalar sus libs, al igual que el otro al mismo tiempo. Puede haber problemas al intentar instalar un nuevo Python, o incluso cualquier biblioteca estándar porque el cliente ya puede depender de una versión diferente. Por lo general, puede instalarlo en una caja de arena para separar sus paquetes de los paquetes del sistema. Esto es más un problema en Linux que en Windows.

Toolchain

La otra opción es crear un conjunto de herramientas para cada sistema operativo soportado. Una cadena de herramientas es todas las dependencias (hasta, pero sin incluir las librerías básicas del sistema operativo como glibc).Esta cadena de herramientas se empaqueta y se distribuye para los clientes de los desarrolladores y. La mejor práctica para una cadena de herramientas es:

  • cambiar el ejecutable para evitar confusiones. (es decir, python -> pkg_python)
  • no instalar en los directorios .../bin para evitar el uso accidental. (es decir, en Linux puede instalar bajo .../libexec. /opt también se usa aunque personalmente lo detesto.)
  • instale sus libs en la ubicación correcta bajo lib/python/site-packages para que no tenga que usar PYTHONPATH.
  • Distribuya los archivos de origen .py para los ejecutables, de modo que el script de instalación pueda ubicarlos de manera adecuada.
  • formato El paquete debe ser un paquete nativo OS (RedHat -> RPM, Debian -> DEB, Win -> MSI)
0

Suponiendo que las bibliotecas 3 ª parte están disponibles en PyPI, utilice distutils, y especificar las versiones requeridas en setup.py.

+0

Bueno, gracias, pero viola el # 3 de mi lista. Suponiendo que no hay conexión a Internet para el cliente. – Dewfy

+0

Si los usuarios no pueden tener una conexión a Internet, la solución es simple. No puede resolverlo sin agrupar todas las bibliotecas necesarias posibles, obviamente. – geoffspear

+0

+1 para agrupar. No estoy seguro, sin embargo, si las bibliotecas quisieran que hicieras eso. – Blender

1
+0

Bueno, gracias, pero viola # 1, # 3 de mi lista. Suponiendo que no hay conexión a Internet para el cliente. Y los desarrolladores siempre deben tomar una versión fija de (??? puede ser un repositorio SVN) – Dewfy

+0

Aconsejaría no poner módulos de terceros en su propio repositorio SVN, especialmente si está desarrollando y probando plataformas cruzadas, ya que tendrán que compilarse de manera diferente. En cuanto a la sugerencia de @ vartec de no cumplir tus requisitos, creo que estás equivocado. Un archivo de requisitos puede especificar un módulo y una versión para ese módulo, por lo que cumple exactamente con sus requisitos. También asegúrese de no violar ningún término de licencia si integra otros proyectos dentro de su propio proyecto. –

+0

@StephenPaulger: nuestro proyecto se distribuye como fuente, por lo tanto, no hay infracción para incluir otras fuentes de la biblioteca LGPL. Ha captado las cosas principales de mi pregunta, pero todavía se abrió. ¿Cuál es la solución técnica correcta para integrar una fiesta en 3D? – Dewfy

3

Puede usar setuptools para crear archivos de huevos para sus bibliotecas, suponiendo que ya no estén disponibles en forma de huevo. A continuación, podría agrupar los huevos junto con su software, que necesitaría instalarlos o asegurarse de que estaban en la ruta de importación.

Esto tiene algunas complejidades, es decir, si sus bibliotecas tienen C-extensions, entonces sus huevos se vuelven específicos de la plataforma, pero en mi experiencia este es el medio más ampliamente aceptado de 'agrupar' cosas en Python.

Tengo que decir que esto sigue siendo una de las debilidades de Python; el ecosistema de terceros ciertamente está dirigido a los desarrolladores en lugar de a los usuarios finales.

+0

, muy de acuerdo con la observación de debilidad del usuario final. Me cuesta encontrar una forma limpia y sistemática de crear herramientas de software y canalizaciones que no causen problemas a los usuarios finales basados ​​en Windows al entregarles el software. –

Cuestiones relacionadas