2011-08-03 62 views
15

¿Cuál es el mejor método para enviar cambios a un programa escrito en Python? Tengo un software escrito en Python que se actualizará periódicamente. Cuál sería la mejor forma de hacer esto? Todas las máquinas tendrán Windows 7.Cómo actualizar aplicaciones de Python de forma remota

Además, disculpen la ambigüedad de mi pregunta. Esta será la primera vez que tenga que implementar un procedimiento de actualización. No dude en mencionar detalles que le gustaría agregar.

+2

¿Actualmente está empaquetando su aplicación para instalación/distribución? ¿Es solo un archivo de script? ¿Necesita actualizar el código de la aplicación o solo está hablando de obtener actualizaciones de datos de la web? –

Respuesta

7

Sugeriría usar un programa de control de fuente como git o subversion. Además, si está de acuerdo con que todos vean el código, puede publicar el código en github, donde cualquiera puede sacarlo. Podrías hacerlo privado, pero tendrías que pagarlo y todos los usuarios también tendrían que crear una cuenta github y configurarla con su instalación git.

Si utiliza un programa de control de fuente, las otras personas tendrán que extraer las ediciones manualmente ejecutando un comando, pero podría hacer un script de archivo por lotes que haga esto y ejecutarlo al inicio oa intervalos regulares .

Para que quede claro, si desea hacer esto, deberá poner el código en un servidor con soporte SSH y configurar git. Si no quiere revisar toda la configuración del servidor, recomendaría github.

git- http://git-scm.com/ (para la versión de Windows, vaya a descargas y seleccione msysGit)

github - https://github.com/

+0

Neil está al acecho aquí. Mercurial y git serían buenas opciones, y usted podría escribir fácilmente un breve script de 'auto-actualización' que se llama cada x días y simplemente saca la última versión del repositorio. – Jonathanb

9

Si usted no está ya envasado de su programa con InnoSetup, recomiendo encarecidamente que cambie a él, porque tiene facilidades para facilitar este tipo de cosas. Puede especificar situaciones especiales, como archivos que no deberían actualizarse si ya existen (es decir, si tiene algún archivo de configuración interna o cosas por el estilo), en el script InnoSetup.

Luego, para permitir que el equipo del cliente conozca las nuevas versiones de su aplicación, conserve un archivo muy pequeño en su servidor web público que tenga el número de versión actual y la URL del instalador de la última versión. Para que este archivo sea útil, cada vez que suelte una versión más reciente de su programa debe actualizar este archivo, así como el número de versión en el script InnoSetup, y también algún tipo de constante APP_VERSION en su programa.

Entonces, usted necesita para manejar estas partes del actualizador de sí mismo:

  1. detectar cuando una nueva versión está disponible mediante la recuperación del archivo de la versión actual de su servidor web a través de HTTP, y la comparación de la versión número allí a la APP_VERSIÓN propia de la aplicación. Asegúrese de hacer esta consulta de forma que falle con elegancia si el equipo cliente no tiene acceso a Internet, y eso no bloquea la GUI mientras realiza la solicitud (en caso de que haya un problema de red que obligue a la consulta a esperar) un largo tiempo para un tiempo de espera).
  2. Si hay una versión más reciente disponible, pregunta al usuario si desea actualizarla y si dice sí descargando un instalador actualizado al directorio TEMP. Dependiendo de qué GUI toolkit esté utilizando, existen diversos mecanismos para mostrar un diálogo de progreso durante la descarga; esta es una buena idea ya que es probable que el instalador sea al menos un MB.
  3. Cerrando su aplicación, ejecutando un script de actualización especial in the background, luego iniciando de nuevo la aplicación.

El script de actualización esperará a que el proceso original a morir por completo (forma más fácil de hacer esto es pasar en el PID del proceso original como un argumento de línea de comandos y tiene la secuencia de comandos de actualización send a query signal 0 to that process cada segundo más o menos hasta que se va de distancia). A continuación, puede ejecutar el instalador de forma silenciosa en segundo plano, tal vez mientras se muestra un cuadro de diálogo "Esperar ..." al usuario. Una vez que el instalador haya finalizado e informe el éxito en su código de retorno, el actualizador puede reiniciar su programa.

Dependiendo de cuán grande sea su aplicación, esto es más derrochador de ancho de banda que el método que usa git u otro SCM. Cada actualización con este enfoque implicaría descargar todo el instalador para la última versión de la aplicación, mientras que un SCM solo descargaría los archivos que han cambiado. Sin embargo, tiene la ventaja de que no requiere instalaciones de servidor especiales, excepto un servidor web regular, y ninguna instalación especial del cliente SCM en la computadora del usuario.

Además, InnoSetup es simplemente genial. :-)

+0

Otra manera más técnicamente agradable de comprobar si su aplicación existente aún está abierta o no, es hacer que su aplicación obtenga un bloqueo de lectura en un archivo temporal con un nombre predeterminado siempre que se esté ejecutando. Esto es genial porque evita una situación de condición de carrera improbable pero posible en la que su aplicación libera su PID, pero otra aplicación nueva toma inmediatamente ese mismo PID. También evitaría que el usuario inicie varias instancias de su aplicación, lo que podría confundir al actualizador. – DSimon

Cuestiones relacionadas