2012-07-11 9 views
17

Tengo un script simple que tiene una dependencia en dnspython para analizar archivos de zona. Me gustaría distribuir este script como .py único que los usuarios pueden ejecutar siempre y cuando tengan 2.6/2.7 instalados. No deseo que el usuario instale dependencias en todo el sitio, ya que podría haber conflictos con los paquetes/versiones existentes, ni tampoco quiero que compartan virtualenv. Me preguntaba si había una manera de insertar un paquete como dnspython dentro del script (gzip/base64) y hacer que ese script acceda a ese paquete en tiempo de ejecución. Tal vez descomprimirlo en un directorio en/tmp y agregar eso a sys.path? No estoy preocupado por la sobrecarga de inicio, solo quiero una .py con todas las dependencias incluidas que puedo distribuir.¿Hay alguna manera de incrustar dependencias dentro de una secuencia de comandos python?

Además, no habría dependencias C para compilar, solo paquetes puros de python.

Editar: El script no tiene que ser un .py. Siempre que sea un solo archivo ejecutable.

+3

Si puede relajar la restricción de un archivo, puede simplemente empacar la biblioteca dnspython junto con su archivo .py, ya sea como un archivo zip o simplemente como un archivo independiente regular, eso resolvería el problema de la dependencia. ¿Eres inflexible acerca de tener solo 1 archivo? –

+4

El camino hacia el infierno de la licencia está pavimentado con incrustación ... –

+0

@MahmoudAbdelkader Supongo que eso funcionaría. Python buscaría en el directorio actual para el paquete antes de buscar en otro lado (aunque creo que este orden está cambiando en 3). Aún así, desearía que hubiera una manera de empaquetar todas las dependencias como un archivo ejecutable que el usuario puede ejecutar y no tener ningún problema. Supongo que no tiene que ser un .py. –

Respuesta

8

Puede empaquetar varios archivos de Python en un .egg. Los archivos egg son esencialmente solo archivos comprimidos con metadatos bien definidos: consulte la documentación de instalación de herramientas para ver cómo hacerlo. Según el docs, puede hacer que los archivos huevo sean directamente ejecutables especificando el punto de entrada. Esto le daría un solo archivo ejecutable que puede contener su código + cualquier otra dependencia.

EDITAR: Hoy en día recomiendo construir un pex para hacer esto. pex es básicamente un archivo zip ejecutable con dependencias no stdlib. No contiene una distribución de python (como py2app/py2exe) pero contiene todo lo demás y se puede construir con una sola invocación de línea de comando. https://pex.readthedocs.org/en/latest/

+1

Gracias, estaba tratando de construir un huevo con setuptools en este momento. Nunca he construido un huevo antes, ya que siempre he oído que han caído en desgracia. –

2

por favor no haga esto. Si lo haces, NO lo hagas.

  • pydns tiene licencia BDS pero si trata de un módulo GPL "embed" de esta manera se podrían meter en problemas
  • se puede aprender a utilizar setuptools y que será mucho más feliz en el largo plazo
  • setuptools se encargará de la instalación de las dependencias que identificó (no estoy seguro si las pydns que está utilizando son python puras, por lo que puede crear problemas para los usuarios si intenta agregarlas sin conocer su entorno)
  • puede establecer una url o pypi para que las personas puedan actualizar su script con easy_install -U
+0

El paquete que estoy usando es dnspython, no pydns.Si setuptools puede construirme un solo ejecutable distribuible que solo requiera python 2.6/2.7, lo usaré. Si dices que simplemente lo utilizas para instalar dependencias en todo el sitio, entonces esto no es lo que estaba pidiendo. dnspython es pura python y no veo nada en su licencia que me impida incrustarlo. Los usuarios finales no son desarrolladores y no conocen nada sobre el ecosistema python (setuptools/easy_install/pip/virtaulenv/etc). –

3

La manera más simple es simplemente poner su secuencia de comandos python llamada __main__.py con dependencias puras de Python en un archivo zip, example.

De lo contrario, PyInstaller podría utilizarse para producir un ejecutable independiente.

Cuestiones relacionadas