在Windows上安全地杀死python脚本

2024-04-24 10:03:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个python脚本,可以在工作时定期抓取网站并将结果存储在.json文件中。这个脚本被设置为在无限循环中不使用命令行运行,所以我可以让它在早上启动,然后在一天中不受阻碍地运行。在

我的问题是,在晚上我会想杀死它,这样我就可以回家了,但是我不想因为在连接或写入过程中终止它而引起任何问题。我想知道在Windows10上创建并销毁这样一个脚本以处理退出行为的正确方法是什么。在


Tags: 文件方法命令行脚本json网站过程我会
1条回答
网友
1楼 · 发布于 2024-04-24 10:03:35

下面是一个使用隐藏窗口监听发送的WM_CLOSE消息的示例taskkill.exe. 在

演示.py

import win32con
import win32gui

def shutdown_monitor():
    def wndproc(hwnd, msg, wparam, lparam):
        if msg == win32con.WM_CLOSE:
            win32gui.DestroyWindow(hwnd)
            return 0
        elif msg == win32con.WM_DESTROY:
            win32gui.PostQuitMessage(0)
            return 0
        return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
    wc = win32gui.WNDCLASS()
    wc.lpszClassName = 'SpamMessages'
    wc.lpfnWndProc = wndproc
    win32gui.RegisterClass(wc)
    hwnd = win32gui.CreateWindow('SpamMessages', 'Python Spam App',
                0, 0, 0, 0, 0, 0, 0, 0, None)
    win32gui.PumpMessages()

if __name__ == '__main__':
    import sys
    import time
    import atexit
    import threading

    atexit.register(print, 'PYTHON SPAM APP: SHUTDOWN')

    shutdown_thread = threading.Thread(target=shutdown_monitor)
    shutdown_thread.start()
    shutdown_thread.join()
    time.sleep(1)
    sys.exit(0x2A)

演示.bat

^{pr2}$

输出

Quit Test
SUCCESS: Sent termination signal to the process with PID 5612.
PYTHON SPAM APP: SHUTDOWN
ExitCode=0000002A

Kill Test
SUCCESS: The process with PID 5432 has been terminated.
ExitCode=00000001

windows8/10任务管理器不认为这个隐藏的窗口属于一个交互式应用程序,也没有在它的“应用程序”列表中列出进程,这与taskkill.exe它强制终止进程,而不是发布WM_CLOSE。任务管理器可能是另一种方法。在

相关问题 更多 >