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()
在 运行 之后,系统会询问用户是要[使用 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()