Python: 重启脚本,功能失效后退出

Python: Restart script and exit it after function does not work

在 运行 之后,系统会询问用户是要[使用 sys.exit()] 结束程序还是重新启动程序 [os.system('main.py')]。
如果他重新启动程序,程序将运行通过,直到他可以再次决定是重新启动还是退出。
如果用户随后想结束程序,但是,这是不可能的,程序无论如何都会重新启动。
另外 quit()exit() 也不起作用。

这是要求用户重启或退出的提示:

while (res := input("Do you want to play again [1] oder exit[2]?\n").lower()) not in {"1", "2"}:
    pass
if res == "1":
    os.system('main.py')
else:
    end_game = True  # Stops the loop, but is not necessary
    print("Sys.exit game")
    sys.exit(0)

当我使用 subprocess.call(sys.executable + ' "' + os.path.realpath(__file__) + '"') 时,
退出程序有效,但程序并没有真正重新启动[开始时设置为0的变量不为0]。

小提示,reboot会重启另一个py文件(main.py),这是主文件,内容如下:

class main:
    game_logic()

if __name__ == '__main__':
    main()

game_logic() 是来自另一个 Py 文件的函数,其中查询重新启动和退出是。

import os
import sys 

while (res := input("Do you want to play again [1] oder exit[2]?\n").lower()) not in {"1", "2"}:
    pass
if res == "1":
    python = sys.executable
    os.execl(python, python, * sys.argv)
else:
    end_game = True  # Stops the loop, but is not necessary
    print("Sys.exit game")
    sys.exit(0)

class main:
    game_logic()

if __name__ == '__main__':
    main()
        

上面的例子应该适合你。您应该使用 os.execl(...) 而不是 os.system(...)。最后一个以递归方式创建新进程并可能导致内存不足问题。您不应该创建新流程,而是想用新流程替换当前流程。这可以通过 execl() 或来自 exec 家庭的其他电话来完成。

要正确理解,您可能需要查看here。它指的是 C 语言,但它有点相同,因为 Python 是环绕本地调用。

Like all of the exec functions, execv replaces the calling process image with a new process image. This has the effect of running a new progam with the process ID of the calling process. Note that a new process is not started; the new process image simply overlays the original process image. The execv function is most commonly used to overlay a process image that has been created by a call to the fork function.

在此期间,我已经能够自己回答这个问题。
我做了以下事情:
game_logic() 是通过另一个 py 文件 (main.py) 启动的。
game_logic()os.system('main.py') 中执行的重新启动时,包含 game_logic() 的当前 py 文件不会终止。
因此,如果 main.py 文件重新启动,我会让包含 game_logic() 的文件随后终止。
看起来像这样:

import os
import sys 

while (res := input("Do you want to play again [1] oder exit[2]?\n").lower()) not in {"1", "2"}:
    pass
if res == "1":
    os.system('main.py')
    exit()
else:
    exit()