Lo que estoy tratando de hacer es enviar mi código a un servidor remoto, que puede tener una versión de Python diferente instalada y / o puede que no tenga los paquetes que requiere mi aplicación.
En este momento, para lograr tal portabilidad, tengo que construir virtualenv reubicable con intérprete y código. Ese enfoque tiene algunos problemas (por ejemplo, debe copiar manualmente un montón de bibliotecas en su virtualenv, ya --always-copy
que no funciona como se esperaba) y generalmente es lento.
Hay (en teoría) una forma de construir Python de forma estática.
Me pregunto si podría empaquetar el intérprete con mi código en un binario y ejecutar mi aplicación como módulo. Algo así: ./mypython -m myapp run
o ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
Respuestas:
Hay dos formas de resolver su problema.
pyinstaller
, opy2exe
cython
Explicaré cómo puede hacerlo usando el segundo, ya que el primer método no es multiplataforma y versión, y se ha explicado en otras respuestas. Además, el uso de programas como pyinstaller generalmente da como resultado tamaños de archivo enormes, mientras que el uso de cython dará como resultado un archivo que tiene un tamaño de KB.
Primero, instale
cython
. Luego, cambie el nombre de su archivo de Python (por ejemplotest.py
) a un.pyx
archivoLuego, puede usarlo
cython
junto con GCC para compilarlo (cython
genera un archivo C a partir de un.pyx
archivo Python y luego GCC compila el archivo C)(en referencia a https://stackoverflow.com/a/22040484/5714445 )
cython test.pyx --embed gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
NOTA : Dependiendo de su versión de Python, es posible que deba cambiar el último comando. Para saber qué versión de Python está usando, simplemente use
Ahora tendrá un archivo binario 'prueba', que es lo que está buscando
Otras cosas a tener en cuenta :
opencv
, por ejemplo), es posible que deba proporcionarles el directorio usando-L
y luego especificar el nombre de la biblioteca usando-l
en las banderas GCC. Para obtener más información sobre esto, consulte las banderas de GCCfuente
cythonize -i file_0.py [...] file_n.py
para todos sus módulos de Python, luegocython main_file.py --embed
para su script principal. Terminará con un ejecutable y archivos .so (.dll, .dylib dependiendo de su sistema operativo) que puede usar juntos como una solución independiente.Es posible que desee investigar Nuitka . Toma el código fuente de Python y lo convierte en llamadas a la API de C ++. Luego se compila en un binario ejecutable (ELF en Linux). Ha existido durante algunos años y es compatible con una amplia gama de versiones de Python.
Probablemente también obtendrá una mejora de rendimiento si lo usa. Recomendado.
fuente
Probablemente esté buscando algo como Freeze, que puede compilar su aplicación Python con todas sus bibliotecas en un binario estático:
Página PyPi de Freeze
Página de Python Wiki de Freeze
Página de Sourceforge de Freeze
fuente
Opciones de congelación:
Sin embargo, su servidor de destino debe tener el entorno que desea -> debería poder 'crearlo'. Si no es así, debe crear su software para que coincida con el entorno.
Encontré esta útil guía sobre cómo instalar una versión personalizada de python en un virtualenv, suponiendo que tenga acceso ssh: https://stackoverflow.com/a/5507373/5616110
En virtualenv, debería poder instalar cualquier cosa con pip y no debería tener que preocuparse por los privilegios de sudo. Por supuesto, tenerlos y acceso al administrador de paquetes como apt hace que todo sea mucho más fácil.
fuente
Si está en una Mac, puede usar py2app para crear un paquete .app, que inicia su aplicación Django cuando hace doble clic en ella.
Describí cómo agrupar Django y CherryPy en un paquete de este tipo en https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html
En el artículo, uso pywebview para mostrar su sitio Django en una ventana de aplicación local.
fuente