Restarting a self-updating python script

前端 未结 8 726
小鲜肉
小鲜肉 2020-11-30 18:48

I have written a script that will keep itself up to date by downloading the latest version from a website and overwriting the running script.

I am not sure what the

相关标签:
8条回答
  • 2020-11-30 18:56

    The cleanest solution is a separate update script!

    Run your program inside it, report back (when exiting) that a new version is available. This allows your program to save all of its data, the updater to apply the update, and run the new version, which then loads the saved data and continues. To the user this can be completely transparent, as they just run the updater-shell which runs the real program.

    0 讨论(0)
  • 2020-11-30 18:59

    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).

    0 讨论(0)
  • 2020-11-30 19:02

    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.)

    0 讨论(0)
  • 2020-11-30 19:04

    To additionally support script calls with Python's "-m" parameter the following can be used (based on the Alex's answer; Windows version):

    os.spawnl(os.P_WAIT, sys.executable, *([sys.executable] +
        (sys.argv if __package__ is None else ["-m", __loader__.name] + sys.argv[1:])))
    sys.exit()
    
    0 讨论(0)
  • 2020-11-30 19:08

    Main File:

    if __name__ == '__main__':
    
    if os.path.isfile('__config.py'):
        print 'Development'
        push.update_server()
    else:
        e = update.check()
        if not e: sys.exit()
    

    Update File:

    def check():
        e = 1.....perform checks, if something needs updating, e=0;
        if not e:
            os.system("python main.pyw")
        return e
    

    Here's the logic:

    Main program calls the update function

    1) If the update function needs to update, than it updates and calls a new instances of "main"

    Then the original instance of "main" exits.

    2) If the update function does not need to update, then "main" continues to run

    0 讨论(0)
  • 2020-11-30 19:15

    The pocoo team have a very good reloader for their development server inside of werkzueg. Check the code out here (it's towards the bottom of the file).

    0 讨论(0)
提交回复
热议问题