Forma robusta de asegurar que otras personas puedan ejecutar mi programa Python

17

Deseo colocar un programa de Python en GitHub y que otras personas lo descarguen y lo ejecuten en sus computadoras con una variedad de sistemas operativos. Soy relativamente nuevo en Python, pero lo he usado lo suficiente como para haber notado que hacer que las diferentes versiones de todos los módulos incluidos funcionen juntos puede ser problemático. Acabo de descubrir el uso de requirements.txt(generado pipreqsy desplegado con el comando pip install -r /path/to/requirements.txt) pero me sorprendió mucho notar que en requirements.txtrealidad no indica qué versión de Python se está utilizando, por lo que obviamente no es la solución completa por sí sola. Entonces mi pregunta es: qué conjunto de especificaciones / archivos / algo más se necesita para garantizar que alguien que descargue mi proyecto realmente pueda ejecutarlo con la menor cantidad de problemas posibles.

EDITAR: Mi plan era guiarme por la respuesta que obtuviera la mayor cantidad de votos. Pero hasta ahora, después de 4 respuestas y 127 vistas, ni una sola respuesta tiene ni siquiera un voto positivo. Si algunas de las respuestas no son buenas, sería útil ver algunos comentarios sobre por qué no son buenas.

Mick
fuente
1
para la menor cantidad de problemas posibles, ¿ha considerado Docker (u otras soluciones basadas en contenedores)? docker.com
Zaccharie Ramzi
Re: Docker ... Acabo de encontrar esto: "el desarrollador puede estar seguro de que la aplicación se ejecutará en cualquier otra máquina Linux", pero quiero que esto funcione en cualquier sistema operativo. ( opensource.com/resources/what-docker )
Mick
Normalmente tiene soporte para todos los sistemas operativos clásicos: windows ( docs.docker.com/docker-for-windows ) y mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi
2
La respuesta aquí es altamente contextual. ¿El programa Python está haciendo cosas que son syso osfunciones de tipo subproceso o más matemáticas / analíticas? El primero puede cambiar con cada versión de Python y luego puede ser bastante independiente de la versión. ¿Qué bibliotecas dependientes? numpy y pandas hacen un trabajo increíble en todas las plataformas para que puedas verificar que tienes una versión mínima ¿Qué versión principal de Python? La diferencia entre Python 2.xy 3.x con bibliotecas dependientes se vuelve aún más difícil. Si escribe un buen código dirigido a una versión principal común que es un gran comienzo.
dawg
2
Como lo demuestra la miríada de respuestas, hay muchas maneras de hacerlo. Tengo mucha curiosidad si las respuestas cambiarían en función de saber cuál es la aplicación. Me gustaría creer que no debería importar, pero sospecho que sí. También creo que depende mucho de la audiencia prevista. Doctorado en física inteligente que ejecuta una aplicación de aprendizaje automático vs Joe internet jugando un juego de damas.
Marcel Wilson

Respuestas:

15

¿Has considerado configurar un setup.pyarchivo? Es una forma práctica de agrupar todos sus ... bien configurados en una sola ubicación. Entonces, todo lo que su usuario tiene que hacer es A) clonar su repositorio y B) ejecutar pip install .para ejecutar elsetup.py

Hay una gran discusión sobre esto.

Además de un ejemplo de identificador escrito por el tipo de solicitudes.

Esto debería cubrir la mayoría de los casos de uso. Ahora, si desea que sea realmente distribuible, entonces querrá considerar configurarlo en PyPi , el centro de distribución oficial.

Más allá de eso, si está preguntando cómo hacer que un programa sea "independiente del sistema operativo", no hay una talla única para todos. Depende de lo que esté haciendo con su código. Requiere investigar cómo interactúa su código particular con esos sistemas operativos, etc.

Taylor Cochran
fuente
7

Hay muchas, muchas, muchas, muchas, muchas, muchas, muchas formas de hacer esto. Voy a patinar sobre los principios detrás de cada uno, y es un caso de uso.

1. Un entorno python

Hay muchas maneras de hacer esto. pipenv, conda requirments.txt, etc. etc.

Con algunos de estos, puede especificar versiones de Python. Con otros, solo especifique un rango de versiones de python con las que sabe que funciona: por ejemplo, si está usando python 3.7, es poco probable que no sea compatible con 3.6; solo hay uno o dos cambios menores. 3.8 debería funcionar también.

Otro método similar es setup.py. En general, se usan para distribuir bibliotecas, como PyInstaller (otra solución que mencionaré a continuación), o numpy, o wxPython, o PyQt5, etc. - para el uso de la línea de importación / comando. La guía de empaquetado de Python es bastante útil, y hay muchos tutoriales disponibles. (google python setup.py tutorial) También puede especificar requisitos en estos archivos.

2. Un contenedor

Docker es el grande. Si no has oído hablar de eso, me sorprenderé. Con esto aparece un resumen rápido de google , que citaré parte de:

Entonces, ¿por qué a todos les encantan los contenedores y Docker? James Bottomley, anteriormente CTO de virtualización de servidores de Parallels y un desarrollador líder de kernel de Linux, explicó que los hipervisores VM, como Hyper-V, KVM y Xen, están "basados ​​en emular hardware virtual. Eso significa que son gordos en términos de Requisitos del sistema."

Los contenedores, sin embargo, usan sistemas operativos compartidos. Esto significa que son mucho más eficientes que los hipervisores en términos de recursos del sistema. En lugar de virtualizar hardware, los contenedores descansan sobre una única instancia de Linux. Esto significa que puede "dejar atrás la inútil basura VM del 99.9 por ciento, dejándolo con una cápsula pequeña y ordenada que contiene su aplicación".

Eso debería resumirlo para ti. (Tenga en cuenta que no necesita un sistema operativo específico para los contenedores).

3. Un archivo ejecutable

Hay 2 herramientas principales que hacen esto al momento de escribir. PyInstaller y cx_Freeze. Ambos se desarrollan activamente. Ambos son de código abierto.

Toma su script y la herramienta lo compila en bytecode, encuentra las importaciones, las copia y crea un entorno portátil de Python que ejecuta su script en el sistema de destino sin que el usuario final necesite Python.

Personalmente, prefiero PyInstaller: soy uno de los desarrolladores. PyInstaller proporciona toda su funcionalidad a través de un script de línea de comandos y es compatible con la mayoría de las bibliotecas en las que puede pensar, y es ampliable para admitir más. cx_Freeze requiere un script de configuración.

Ambas herramientas son compatibles con Windows, Linux, macOS y más. PyInstaller puede crear archivos ex, o un paquete de una carpeta, mientras que cx_Freeze solo admite paquetes de una carpeta. PyInstaller 3.6 es compatible con python 2.7 y 3.5-3.7, pero 4.0 no es compatible con python 2. cx_Freeze ha dejado de ser compatible con python 2 a partir de la última versión importante (creo que 6.0).

De todos modos, lo suficiente sobre las características de las herramientas; usted puede mirar en esos usted mismo. (Consulte https://pyinstaller.org y https://cx-freeze.readthedocs.io para obtener más información)

Cuando usa este método de distribución, generalmente proporciona el código fuente en el repositorio de GitHub, un par de exes (uno para cada plataforma) listos para descargar e instrucciones sobre cómo construir el código en un archivo ejecutable.

Legorooj
fuente
1

La mejor herramienta que he usado hasta ahora para esto es Pipenv . No solo unifica y simplifica todo el flujo de trabajo pip + virtualenv para usted, desarrollador, sino que también garantiza que se cumplan las versiones exactas de todas las dependencias (incluido Python) cuando otras personas ejecutan su proyecto con él.

El sitio web del proyecto hace un trabajo bastante bueno al explicar cómo usar la herramienta, pero, para completar, daré una breve explicación aquí.

Una vez que haya instalado Pipenv (por ejemplo, ejecutando pip install --user pipenv), puede ir al directorio de su proyecto y ejecutarlo pipenv --python 3.7, por lo que Pipenv creará un nuevo virtualenv para su proyecto, creará un Pipfile y un Pipfile.lock (más sobre ellos más adelante) . Si sigue adelante y lo ejecuta pipenv install -r requirements.txt, instalará todos sus paquetes. Ahora puede hacer una pipenv shellpara activar su nuevo virtualenv, o pipenv run your_main_file.pysimplemente para ejecutar su proyecto.

Ahora echemos un vistazo a los contenidos de su Pipfile. Debería ser algo parecido a esto:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Este archivo tiene las especificaciones legibles por humanos para las dependencias de su proyecto (tenga en cuenta que también especifica la versión de Python). Si su require.txt tenía versiones ancladas, su Pipfile también podría tenerlas, pero puede usarlas como comodín de forma segura, porque las versiones exactas se almacenan en el Pipfile.lock. Ahora puede ejecutar cosas como pipenv updateactualizar sus dependencias y no olvide enviar Pipfile y Pipfile.lock a su VCS.

Una vez que la gente clone su proyecto, todo lo que tienen que hacer es ejecutar pipenv instally Pipenv se encargará del resto (incluso puede instalar la versión correcta de Python para ellos).

Espero que esto haya sido útil. No estoy afiliado de ninguna manera con Pipenv, solo quería compartir esta increíble herramienta.

gflorio
fuente
1

Si su programa tiene menos de GUI, o tiene una GUI web, puede compartir el código usando Google Colaboratory.

https://colab.research.google.com/

Todos pueden ejecutarlo con el mismo entorno. No hay necesidad de instalación.

korakot
fuente
1

En caso de que convertir todos sus scripts de python en un ejecutable pueda ayudarlo, entonces mi respuesta a continuación ayudaría ...

He estado desarrollando una gran aplicación de escritorio puramente en Python desde hace 3 años. Es una herramienta basada en GUI construida sobre la biblioteca pyqt (enlaces de python del marco QT C ++).

Actualmente estoy usando la biblioteca de empaquetado " py2exe ": es una extensión distutils que permite construir programas ejecutables de Windows independientes (32 bits y 64 bits) a partir de scripts de Python; todo lo que tienes que hacer es:

  1. instalar py2exe: 'pip install py2exe'

  2. Cree un script setup.py: se utiliza para especificar el contenido del EXE final (nombre, icono, autor, archivos de datos, bibliotecas compartidas, etc.)

  3. Ejecutar: python setup.py py2exe

También estoy usando el software "Inno Setup" para crear el instalador: creación de accesos directos, configuración de variables de entorno, iconos, etc.

Rida Shamasneh
fuente
py2exe no se ha actualizado en años. No puedo encontrar ninguna actividad reciente. Asumiría entonces que no se mantiene. (Además, solo admite python <3.4. Eso significa que solo admite versiones obsoletas de python).
Legorooj
-1

Debido a que falta en las otras respuestas, me gustaría agregar un aspecto completamente diferente:

Examen de la unidad. O pruebas en general.

Por lo general, es bueno tener una buena configuración conocida. Según cuáles sean las dependencias del programa, es posible que deba probar diferentes combinaciones de paquetes. Puede hacerlo de manera automatizada con, por ejemplo, toxo como parte de una canalización de CI / CD.

No existe una regla general sobre qué combinación de paquetes debe probarse, pero generalmente la compatibilidad de python2 / 3 es un problema importante. Si tiene fuertes dependencias en paquetes con diferencias importantes de versión, es posible que desee considerar probar estas versiones diferentes.

Dschoni
fuente
Este es un aspecto muy importante del desarrollo de software. Sin embargo, esto no responde completamente la pregunta . ¿Cómo ayudan las pruebas unitarias a la distribución de un programa?
Legorooj
En mi humilde opinión, OP no está preguntando específicamente sobre la distribución. Él pregunta formas de asegurarse de que otras personas puedan ejecutar su programa. Creo que las pruebas unitarias pueden ayudar a hacerlo, ya que las personas pueden estar restringidas en el conjunto de paquetes que se pueden usar. En general, la pregunta de distribución es importante (y se ha respondido aquí), pero creo que en un escenario del mundo real, no podemos confiar en crear un venv completo solo para un solo paquete: debe ser compatible con al menos algunas configuraciones estándar.
Dschoni
No estoy discutiendo que las pruebas unitarias son valiosas para garantizar que se ejecuten correctamente, pero el OP me preguntó cómo compartir el código de una manera "fácil de instalar". Es por eso que creo que esta es una respuesta no válida, para esta pregunta específica.
Legorooj
Sigo pensando que la pregunta no es solo sobre distribución. Por eso agregué esta respuesta. Si desarrolla, por ejemplo, en Windows, las pruebas en Unix son esenciales si desea asegurarse de que se ejecute antes de la distribución.
Dschoni
Por curiosidad, ¿en qué se diferencia de lo que acabo de decir? ... making sure it runs correctly ...? Las pruebas son una parte esencial de asegurarse de que funciona correctamente, por lo tanto es una parte esencial de la preparación para distribuirlo, pero aún así no es nada que ver con la realidad distribución que
Legorooj
-1

Le daré un resumen muy breve de algunas de las soluciones disponibles existentes en lo que respecta al empaquetado de Python que puede elegir (el conocimiento es poder):

  1. Siga las pautas proporcionadas en Estructurando su proyecto , estas convenciones son ampliamente aceptadas por la comunidad de Python y generalmente es un buen punto de partida cuando los recién llegados comienzan a codificar en Python. Al seguir estas pautas, los pitonistas que vean su proyecto / fuente en github u otros lugares similares sabrán de inmediato cómo instalarlo. Además, cargar su proyecto a pypi y agregar CI siguiendo esas reglas será sencillo.

  2. Una vez que su proyecto esté estructurado adecuadamente de acuerdo con las convenciones estándar, el siguiente paso podría ser usar algunos de los congeladores disponibles , en caso de que desee enviar a sus usuarios finales un paquete que puedan instalar sin obligarlos a tener Python instalado en su máquinas. Tenga en cuenta que estas herramientas no le proporcionarán ninguna protección de código ... dicho de otro modo, extraer el código original de Python de los artefactos finales sería trivial en todos los casos

  3. Si aún desea enviar su proyecto a sus usuarios sin obligarlos a instalar ninguna dependencia de desarrollo y también le importa la protección del código, por lo que no desea considerar ninguno de los congeladores existentes, puede usar herramientas como nuitka , shedskin , Cython o similares. Por lo general, invertir el código de los artefactos producidos por estas herramientas no es trivial en absoluto ... La protección contra grietas, por otro lado, es una cuestión diferente y, a menos que no proporcione un binario físico a su usuario final, no puede hacer mucho sobre eso aparte de ralentizarlos :)

  4. Además, en caso de que necesite usar lenguajes externos en su proyecto de Python, otro enlace clásico que se le ocurra sería https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , agregando los sistemas de compilación de tales herramientas a CI siguiendo las reglas de 1 serían bastante fáciles.

Dicho esto, sugeriría seguir con el punto 1, ya que sé que será más que suficiente para comenzar, también ese punto en particular debería cubrir muchos de los casos de uso existentes para proyectos "estándar" de Python.

Si bien esto no pretende ser una guía completa al seguirlos, podrá publicar su proyecto de Python a las masas en poco tiempo.

BPL
fuente