2017-04-25 78 views
1

我已經創建了一個python腳本來定期刮取網站並將結果存儲在工作時的.json文件中。這個腳本被設置爲在無限循環中沒有命令行的情況下運行,所以我可以在早上開始,然後在整個一天內不受阻礙地運行。安全地殺死Windows上的python腳本

我的問題是,在晚上我要殺死它,以便我可以回家,但我不想在連接中途或中途寫入時導致任何問題。我想知道什麼是正確的方式來處理創建,並隨後銷燬Windows 10上的這種腳本來處理退出行爲。

+0

通常您會創建一個可以使用services.msc啓動和停止的服務,或者從命令行使用sc.exe或net.exe創建一個服務。 PyWin32擁有您實施服務所需的一切。它帶有基本的示例代碼,網絡上有很多示例。 – eryksun

回答

0

這是一個使用隱藏窗口來偵聽taskkill.exe發送的WM_CLOSE消息的示例。

demo.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) 

demo.bat

@echo off 
setlocal 
set killquit=taskkill /fi "windowtitle eq Python Spam App" 
set killkill=taskkill /f /fi "windowtitle eq Python Spam App" 

echo Quit Test 
start /b cmd /c "(timeout 3 >nul) & %killquit%" & demo.py 
echo ExitCode=%=ExitCode% 
echo. 
echo Kill Test 
start /b cmd /c "(timeout 3 >nul) & %killkill%" & demo.py 
echo ExitCode=%=ExitCode% 

輸出

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 

在Windows 8/10任務管理器不考慮這個隱藏窗口屬於一個交互式應用程序,並沒有在其「應用程序」列表中列出進程,因此與taskkill.exe不同,它會強制終止該進程而不是發佈WM_CLOSE。可能有其他方法可以強制任務管理器將流程歸類爲「應用程序」。