Search code examples
pythonwindowssleepsuspend

Sleep / Suspend / Hibernate Windows PC


I'd like to write a short python script that puts my computer to sleep. I'Ve already searched the API but the only result on suspend has to do with delayed execution. What function does the trick ?


Solution

  • Without resorting to shell execution, if you have pywin32 and ctypes:

    import ctypes
    import win32api
    import win32security
    
    def suspend(hibernate=False):
        """Puts Windows to Suspend/Sleep/Standby or Hibernate.
    
        Parameters
        ----------
        hibernate: bool, default False
            If False (default), system will enter Suspend/Sleep/Standby state.
            If True, system will Hibernate, but only if Hibernate is enabled in the
            system settings. If it's not, system will Sleep.
    
        Example:
        --------
        >>> suspend()
        """
        # Enable the SeShutdown privilege (which must be present in your
        # token in the first place)
        priv_flags = (win32security.TOKEN_ADJUST_PRIVILEGES |
                      win32security.TOKEN_QUERY)
        hToken = win32security.OpenProcessToken(
            win32api.GetCurrentProcess(),
            priv_flags
        )
        priv_id = win32security.LookupPrivilegeValue(
           None,
           win32security.SE_SHUTDOWN_NAME
        )
        old_privs = win32security.AdjustTokenPrivileges(
            hToken,
            0,
            [(priv_id, win32security.SE_PRIVILEGE_ENABLED)]
        )
    
        if (win32api.GetPwrCapabilities()['HiberFilePresent'] == False and
            hibernate == True):
                import warnings
                warnings.warn("Hibernate isn't available. Suspending.")
        try:
            ctypes.windll.powrprof.SetSuspendState(not hibernate, True, False)
        except:
            # True=> Standby; False=> Hibernate
            # https://msdn.microsoft.com/pt-br/library/windows/desktop/aa373206(v=vs.85).aspx
            # says the second parameter has no effect.
    #        ctypes.windll.kernel32.SetSystemPowerState(not hibernate, True)
            win32api.SetSystemPowerState(not hibernate, True)
    
        # Restore previous privileges
        win32security.AdjustTokenPrivileges(
            hToken,
            0,
            old_privs
        )
    

    If you want just a one-liner with pywin32 and has the right permissions already (for a simple, personal script):

    import win32api
    win32api.SetSystemPowerState(True, True)  # <- if you want to Suspend
    win32api.SetSystemPowerState(False, True)  # <- if you want to Hibernate
    

    Note: if your system has disabled hibernation, it will suspend. In the first function I included a check to at least warn of this.