How To Make a Python Program Automatically Restart Itself

后端 未结 5 1772
一生所求
一生所求 2020-12-08 11:51

How do you make a python program automatically restart itself? So let\'s say there is a really simple program like:

    var = input(\"Hi! I like cheese! Do y         


        
5条回答
  •  猫巷女王i
    2020-12-08 12:30

    It depends on what you mean by "restart itself." If you just want to continuously execute the same code, you can wrap it in a function, then call it from within a while True loop, such as:

    >>> def like_cheese():
    ...     var = input("Hi! I like cheese! Do you like cheese?").lower()  # Corrected the call to `.lower`.
    ...     if var == "yes":
    ...         print("That's awesome!")
    ...
    >>> while True:
    ...     like_cheese()
    ...
    Hi! I like cheese! Do you like cheese?yes
    That's awesome!
    Hi! I like cheese! Do you like cheese?yes
    That's awesome!
    

    If you want to actually restart the script you can execute the script again, replacing the current process with the new one by doing the following:

    #! /bin/env python3
    import os
    import sys
    
    def like_cheese():
        var = input("Hi! I like cheese! Do you like cheese?").lower()
        if var == "yes":
            print("That's awesome!")
    
    if __name__ == '__main__':
        like_cheese()
        os.execv(__file__, sys.argv)  # Run a new iteration of the current script, providing any command line args from the current iteration.
    

    This will continuously re-run the script, providing the command line arguments from the current version to the new version. A more detailed discussion of this method can be found in the post "Restarting a Python Script Within Itself" by Petr Zemek.

    One item that this article notes is:

    If you use the solution above, please bear in mind that the exec*() functions cause the current process to be replaced immediately, without flushing opened file objects. Therefore, if you have any opened files at the time of restarting the script, you should flush them using f.flush() or os.fsync(fd) before calling an exec*() function.

提交回复
热议问题