I was trying to multithread the code for “Suspend / Hibernate pc with python” provided by Ronan Paixão when I find that time.sleep()
does not suspend the thread that run pywin32
module.
>>> Warning! The following code will put Windows to sleep <<<
def suspend(buffer, hibernate=False): '''Puts Windows to Suspend/Sleep/Standby or Hibernate. Parameters ---------- buffer: string, for time.sleep() 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() ''' print('before sleep') sleep(float(buffer)) print('after sleep') # 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: 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 __name__ == '__main__': Thread(target=suspend, args=("10")).start()
The print
function did waited for time.sleep()
, but the Windows was immediately put to sleep.
What happened?
Advertisement
Answer
You’re passing the buffer argument in the call to Thread
incorrectly, so it’s only sleep
ing for 1.0 second. You need to add a comma ,
at the end of value for the args
keyword argument like this:
. . if __name__ == '__main__': Thread(target=suspend, args=("10",)).start()