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 pipreqs
y desplegado con el comando pip install -r /path/to/requirements.txt
) pero me sorprendió mucho notar que en requirements.txt
realidad 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.
fuente
sys
oos
funciones 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.Respuestas:
¿Has considerado configurar un
setup.py
archivo? 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) ejecutarpip 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.
fuente
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
, condarequirments.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. (googlepython 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:
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.
fuente
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 ejecutarlopipenv --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 ejecutapipenv install -r requirements.txt
, instalará todos sus paquetes. Ahora puede hacer unapipenv shell
para activar su nuevo virtualenv, opipenv run your_main_file.py
simplemente para ejecutar su proyecto.Ahora echemos un vistazo a los contenidos de su Pipfile. Debería ser algo parecido a esto:
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 update
actualizar 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 install
y 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.
fuente
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.
fuente
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:
instalar py2exe: 'pip install py2exe'
Cree un script setup.py: se utiliza para especificar el contenido del EXE final (nombre, icono, autor, archivos de datos, bibliotecas compartidas, etc.)
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.
fuente
Creo que puedes usar Docker con tu Python https://github.com/celery/celery/tree/master/docker
Siga amablemente los archivos y creo que puede encontrar la manera de hacer su archivo acoplable para sus scripts de Python.
fuente
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,
tox
o 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.
fuente
... 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 queLe 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):
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.
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
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 :)
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.
fuente