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.