Detecting computer/program shutdown in Python?

I have a Python script that runs in a loop regularly making adjustments to my lighting system. When I shut down my computer, I'd like my script to detect that, and turn off the lights altogether.

How do I detect my computer beginning to shut down in Python?

Or, assuming Windows sends Python a "time to shut down" notice, how do I intercept that to kill my lights and exit the loop?


This is the wrong way to go about performing action at system shutdown time. The job of the shutdown process is to stop running processes and then switch off power; if you try to detect this happening from within your program and react by getting some last action in, it's a race between the OS and your program who gets to go first. More likely than not your program will have been stopped before it managed to perform the necessary action.

Instead, you should hook into the normal protocol for doing things at shutdown. This will tell the shutdown utility to send an explicit signal to your program and wait for it to be acknowledged, which gives you enough time (within reason) to do what you have to do. How exactly to register to be notified varies with the OS, so this is more of an OS-specific question rather than a Python question.


You should react to the WM_ENDSESSION message.

This message is sent when the user logs off or the computer gets shut down.

If you want to react to Sleep/Hibernate as well, you'll need to handle WM_POWERBROADCAST with PBT_APMSUSPEND.

But I don't know how to do that in python. I guess it depends on your windowing framework since you need have a windows/a message loop to receive messages.