Saltar al contenido

Reiniciar un script de python de actualización automática

Después de investigar en varios repositorios y sitios de internet finalmente dimos con la respuesta que te mostramos a continuación.

Solución:

En Linux, o cualquier otra forma de Unix, os.execl y amigos son una buena opción para esto; solo necesita volver a ejecutar sys.executable con los mismos parámetros con los que se ejecutó la última vez (sys.argv, más o menos) o cualquier variante del mismo si necesita informar a su próxima encarnación que en realidad es un reinicio. En Windows, os.spawnl (y amigos) es lo mejor que puede hacer (aunque transitoriamente tomará más tiempo y memoria que os.execl y amigos durante la transición).

El proyecto CherryPy tiene un código que se reinicia solo. Así es como lo hacen:

    args = sys.argv[:]
    self.log('Re-spawning %s' % ' '.join(args))

    args.insert(0, sys.executable)
    if sys.platform == 'win32':
        args = ['"%s"' % arg for arg in args]

    os.chdir(_startup_cwd)
    os.execv(sys.executable, args)

He usado esta técnica en mi propio código y funciona muy bien. (No me molesté en hacer el paso de citar argumentos en las ventanas anteriores, pero probablemente sea necesario si los argumentos pueden contener espacios u otros caracteres especiales).

Creo que la mejor solución sería algo como esto:

Su programa habitual:

...

# ... part that downloaded newest files and put it into the "newest" folder

from subprocess import Popen

Popen("/home/code/reloader.py", shell=True) # start reloader

exit("exit for updating all files")

El script de actualización: (p. ej.: home/code/reloader.py)

from shutil import copy2, rmtree
from sys import exit

# maybie you could do this automatic:
copy2("/home/code/newest/file1.py", "/home/code/") # copy file
copy2("/home/code/newest/file2.py", "/home/code/")
copy2("/home/code/newest/file3.py", "/home/code/")
...

rmtree('/home/code/newest') # will delete the folder itself

Popen("/home/code/program.py", shell=True) # go back to your program

exit("exit to restart the true program")

Espero que esto ayude.

Aquí tienes las comentarios y puntuaciones

Si entiendes que ha sido de ayuda nuestro post, te agradeceríamos que lo compartas con más programadores y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *