2017-04-25 15 views
1

私は定期的にウェブサイトを掻き集めて、仕事中に.jsonファイルに結果を保存するためのpythonスクリプトを作成しました。このスクリプトは、無限ループでコマンドラインを使わずに実行するように設定されているため、午前中に起動し、一日中妨げにならないように実行できます。安全にWindows上でpythonスクリプトを殺す

私の問題は、夜間に私は家に帰ることができるようにそれを殺すつもりだが、私はそれを中断または中途半端に殺すことに問題を生じさせたくないということです。私は、Windows 10でそのようなスクリプトを作成し、それを破棄して終了動作を処理する正しい方法が何であるか疑問に思っていました。

+0

一般的に、services.mscを使用するか、コマンドラインからsc.exeまたはnet.exeを使用して起動および停止できるサービスを作成します。 PyWin32には、サービスを実装するために必要なものすべてがあります。これには基本的なサンプルコードが付属しており、ウェブ上には多くの例があります。 – eryksun

答えて

0

ここでは、隠されたウィンドウを使用してtaskkill.exeによって送信されたWM_CLOSEメッセージをリッスンする例を示します。 Windowsの8/10のタスクマネージャにはない

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) 

@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% 

demo.bat出力

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 

この非表示ウィンドウを対話型アプリケーションに属するものと見なし、そのプロセスを「Apps」リストにリストしないので、taskkill.exeとは異なり、強制的にWM_CLOSEの代わりにプロセスを終了します。タスクマネージャにプロセスを「アプリ」として分類させる他の方法もあります。

関連する問題