Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:检查程序是否正在关闭_Python_Python 3.x - Fatal编程技术网

Python:检查程序是否正在关闭

Python:检查程序是否正在关闭,python,python-3.x,Python,Python 3.x,全部 有没有办法使用Python检查当前正在运行的脚本是否被请求关闭?例如,如果我按右上角的X按钮(close program按钮)将其关闭,或者以任何其他方式结束脚本,脚本是否可以在结束之前执行一些代码?例如: # script goes here... if Script_To_Be_Closed: # replace this with an actual line of code. do_stuff 您可以使用多种选项,如捕捉键盘中断,但最简单的是atexit,它在脚本结束时

全部

有没有办法使用Python检查当前正在运行的脚本是否被请求关闭?例如,如果我按右上角的X按钮(close program按钮)将其关闭,或者以任何其他方式结束脚本,脚本是否可以在结束之前执行一些代码?例如:

# script goes here...

if Script_To_Be_Closed: # replace this with an actual line of code.
    do_stuff

您可以使用多种选项,如捕捉键盘中断,但最简单的是atexit,它在脚本结束时执行函数(除了硬进程终止)


您可以使用shell脚本来执行此任务

您可以看到下面显示的脚本命令,该命令在执行命令以运行python文件后调用自身。一旦python文件关闭,下一行将强制python命令再次运行。您还可以根据自己的需要定制行为

main.py

#!/bin/bash
python3 ./main.py
source ./infiniteRun.sh

如果需要停止作业,只需编辑文件并删除最后一行
source./infiniteRun.sh
并保存文件。

这是否回答了您的问题?哪个“右上角的X按钮”?@Brunodesshuilliers他说的是一个典型窗口的关闭按钮,不管在什么地方OS@Sofian这实际上是一个重复的问题——我想让OP理解“窗口按钮”不是Python脚本的属性,而是GUI的属性(由Python脚本本身或系统伪终端窗口的一部分创建)并且相当多的“Python脚本”仅仅是在伪终端之外执行的命令行工具(没有GUI)。您尝试过吗?它只适用于正常的
sys.exit()
或主模块的结尾。这并不避免注册信号处理程序的需要。问题中没有具体说明,但atexit应该处理CTRL+C(使用Python 3.8测试)SIGINT(按下CTRL-C时发送)通常由python处理,因此会导致
KeyboardInterrupt
异常。如果未捕获此异常(并且会话是非交互式的),则python将正常退出(尽管状态为错误)。如果您使用SIGHUP进行尝试,它将被操作系统直接终止,除非您明确安装了处理程序——atexit不会为您执行此操作。hmm…正如atexit python文档所述,只有python未处理的信号才会阻止atexit运行(即通过kill-9左右执行SIGKILL).SIGINT或SIGHUP由python AFAIK处理,因此atexit应该在收到这些信号时运行。当我实际使用SIGHUP时,它对我不起作用。虽然进程可以为除SIGKILL和SIGSTOP之外的所有内容安装处理程序,但没有迹象表明python确实为SIGHUP安装了处理程序。实际上,如果使用
signal.signal
您自己安装一个新的处理程序,它将返回现有的处理程序,并且您将看到(即使在atexit.register之后)SIGHUP的现有处理程序仍然返回为
处理程序.SIG_DFL
,即操作系统默认的信号处理程序(与SIGINT不同,SIGINT是
default_int_handler
)。
#!/bin/bash
python3 ./main.py
source ./infiniteRun.sh