Suspend / Hibernate pc with python

后端 未结 7 1417
庸人自扰
庸人自扰 2021-01-19 02:01

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

相关标签:
7条回答
  • 2021-01-19 02:41

    Get pywin32, it also contains win32security if I remember correctly. Then try the mentioned script again.

    0 讨论(0)
  • 2021-01-19 02:44
    subprocess.call(['osascript', '-e','tell app "System Events" to sleep'])
    
    0 讨论(0)
  • 2021-01-19 02:52

    You can run shell command from python script. See subprocess module and then search for appropriate command for your operating system.

    0 讨论(0)
  • 2021-01-19 02:54

    I don't know how to sleep. But I know how to Hibernate (on Windows). Perhaps that is enough? shutdown.exe is your friend! Run it from the command prompt.

    To see its options do shutdown.exe /?

    I believe a hibernate call would be: shutdown.exe /h

    So, putting it all together in python:

    import os
    os.system("shutdown.exe /h")
    

    But as other have mentioned, it is bad to use os.system. Use the popen instead. But, if you're lazy like me and its a little script them meh! os.system it is for me.

    0 讨论(0)
  • 2021-01-19 02:54

    If you're using Windows, see: http://permalink.gmane.org/gmane.comp.python.windows/7382

    0 讨论(0)
  • 2021-01-19 02:56

    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.

    0 讨论(0)
提交回复
热议问题