Incluir dependencias en tiempo de ejecución en las ruedas de Python

Me gustaría distribuir un virtualenv completo, o un montón de ruedas Python de versiones exactas con sus dependencias de tiempo de ejecución, por ejemplo:

  • pycurl
    • pycurl.so
      • libcurl.so
        • libz.so
        • libssl.so
        • libcrypto.so
        • libgssapi_krb5.so
          • libkrb5.so
            • libresolv.so

Supongo que podría confiar en el sistema para tener libssl.so instalado, pero seguramente no libcurl.so de la versión correcta y probablemente no Kerberos.

¿Cuál es la forma más fácil de empaquetar una biblioteca en una rueda con toda la dependencia del tiempo de ejecución?

¿O es eso una tarea de tontos y debería empaquetar todo virtualenv? ¿Cómo hacerlo de forma fiable?

La comstackción de PS al vuelo no es una opción, algunos módulos están parcheados.

AFAIK, no existe una buena forma estándar de instalar de manera portátil las dependencias con su paquete. Continuum ha hecho conda precisamente para este propósito . Los chicos adormecidos escribieron su propio submódulo de distritos en su paquete para instalar algunas dependencias complicadas, y ahora al menos algunos de ellos abogan por conda como una solución . Desafortunadamente, es posible que tenga que hacer paquetes de Conda para algunas de estas dependencias.

Si está bien sin portabilidad, obviamente funcionará con el administrador de paquetes de las máquinas de destino. De lo contrario, para un gestor de paquetes portátil, conda es la única opción que conozco.

Alternativamente , desde su publicación (“comstackr sobre la marcha no es una opción”) parece que la portabilidad puede no ser un problema para usted, en cuyo caso también puede instalar todos los requisitos en un directorio de prefijos (la mayoría de los instaladores que he visitado a través de soporte a configure --prefix=/some/dir/ option). Si tiene una architecture única garantizada, probablemente podría instalar todas sus dependencias en un solo directorio y transferirlas como un archivo. El enfoque de Conda probablemente sería más limpio, pero he usado las instalaciones de prefijos bastante y tienden a ser una de las soluciones más fáciles para ponerse en marcha.

Edición: En cuanto a Conda, es simultáneamente un gestor de paquetes y una instalación de entorno / python similar a “virtualenv”. Si bien virtualenv se agrega a una instalación de Python existente, conda se hace cargo de toda la instalación, por lo que puede estar más seguro de que se tienen en cuenta todas las dependencias. Comparado con pip, está diseñado para agregar dependencias no Python generalizadas, en lugar de simplemente comstackr las exenciones de C / Cpp. Para más información, me gustaría ver:

  • pip vs conda (también recomienda buildout como una posibilidad)
  • Conda como una instalación de Python

En cuanto a cómo usar conda para su propósito, los documentos explican cómo crear una receta:

Conda construir framework

La construcción de un paquete requiere una receta. Una receta es un directorio plano que contiene los siguientes archivos:

  • meta.yaml (archivo de metadatos)
  • build.sh (script de comstackción de Unix que se ejecuta usando bash)
  • bld.bat (script de comstackción de Windows que se ejecuta utilizando cmd)
  • run_test.py (archivo de prueba de Python opcional)
  • parches a la fuente (opcional, ver más abajo)
  • Otros recursos, que no están incluidos en la fuente y no pueden ser generados por los scripts de comstackción.

La misma receta debe usarse para construir un paquete en todas las plataformas.

Al construir un paquete, se invocan los siguientes pasos:

  1. lee los metadatos
  2. descargar la fuente (en un caché)
  3. extraer la fuente en un directorio de origen
  4. aplicar los parches
  5. crear un entorno de comstackción (las dependencias de comstackción se instalan aquí)
  6. ejecutar el script de comstackción real. El directorio de trabajo actual es el directorio de origen con las variables de entorno establecidas. El script de comstackción se instala en el entorno de comstackción
  7. hacer algunos pasos necesarios de procesamiento posterior: shebang, rpath, etc.
  8. agregar metadatos de Conda al entorno de comstackción
  9. empacar los nuevos archivos en el entorno de comstackción en un paquete conda
  10. prueba el nuevo paquete de conda:
    • crear un entorno de prueba con el paquete (y sus dependencias)
    • ejecutar los scripts de prueba

Hay recetas de ejemplo para muchos paquetes de conda en las conda-recipes _ repo.

El conda skeleton : ref: conda skeleton puede ayudar a hacer recetas de esqueleto para repositorys comunes, como PyPI _.

Luego, como cliente, instalaría el paquete de manera similar a como lo haría desde pip

Por último, la ventana acoplable también puede ser interesante para usted, aunque no la he visto demasiado usada para Python.

Es posible que desee ver en PEX: https://pex.readthedocs.io/en/stable/whatispex.html

Los archivos con la extensión .pex (“archivos PEX” o “archivos .pex”) son entornos virtuales de Python ejecutables independientes. Los archivos PEX facilitan la implementación de aplicaciones Python: el proceso de implementación se convierte simplemente en scp ‘.