Restarting a self-updating python script Restarting a self-updating python script python python

Restarting a self-updating python script


In Linux, or any other form of unix, os.execl and friends are a good choice for this -- you just need to re-exec sys.executable with the same parameters it was executed with last time (sys.argv, more or less) or any variant thereof if you need to inform your next incarnation that it's actually a restart. On Windows, os.spawnl (and friends) is about the best you can do (though it will transiently take more time and memory than os.execl and friends would during the transition).


The CherryPy project has code that restarts itself. Here's how they do it:

    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)

I've used this technique in my own code, and it works great. (I didn't bother to do the argument-quoting step on windows above, but it's probably necessary if arguments could contain spaces or other special characters.)


I think the best solution whould be something like this:

Your normal program:

...# ... part that downloaded newest files and put it into the "newest" folderfrom subprocess import PopenPopen("/home/code/reloader.py", shell=True) # start reloaderexit("exit for updating all files")

The update script: (e.g.: home/code/reloader.py)

from shutil import copy2, rmtreefrom sys import exit# maybie you could do this automatic:copy2("/home/code/newest/file1.py", "/home/code/") # copy filecopy2("/home/code/newest/file2.py", "/home/code/")copy2("/home/code/newest/file3.py", "/home/code/")...rmtree('/home/code/newest') # will delete the folder itselfPopen("/home/code/program.py", shell=True) # go back to your programexit("exit to restart the true program")

I hope this will help you.