Versión: 2.4+, 3.x.
La función de suspender coloca al ordenador en un estado de bajo consumo de recursos y energía, previo al guardado del estado del sistema en la memoria RAM. Por esta razón, al ser desconectado o apagado, la información guardada se pierde. La función de hibernar, en cambio, almacena el estado del sistema en el disco y se apaga por completo, de modo que, al encenderlo nuevamente, nos encontramos con todo en su lugar (¡el que ocupaba previo al apagado!). Si el sistema no está configurado correctamente o bien el hardware no soporta la función de hibernar, ésta equivale a un apagado convencional.
Sin más preámbulos, ¡veamos algunos sencillos métodos para poner a dormir nuestra computadora!
Linux
La mayoría de las distribuciones de Linux con un entorno de escritorio implementan el comando dbus-send, que resulta bastante agradable al no requerir permisos de administrador.
Utilizamos la función subprocess.call para invocar el comando.
from subprocess import call
# Suspender.
call('dbus-send --system --dest="org.freedesktop.UPower" '
'--print-reply /org/freedesktop/UPower '
'org.freedesktop.UPower.Suspend', shell=True)
# Hibernar.
call('dbus-send --system --dest="org.freedesktop.UPower" '
'--print-reply /org/freedesktop/UPower '
'org.freedesktop.UPower.Hibernate', shell=True)
Como alternativa puede utilizarse rtcwake, aunque requiere permisos de administrador. Ofrece la ventaja de despertar automáticamente de un estado de suspensión. Por ejemplo, el siguiente código suspende el sistema y lo reanuda luego de 20 segundos.
# Suspender y despertar luego de 20 segundos.
call("rtcwake -s 20 -m mem", shell=True)
De forma similar, la opción -m disk permite hibernar.
Windows
Empleamos la función de la API de Windows SetSuspendState vía el módulo estándar ctypes.
from ctypes import windll
# Suspender.
if not windll.powrprof.SetSuspendState(False, False, False):
print("No se ha podido suspender el sistema.")
El primer argumento de la función determina si el sistema debe ingresar en estado de suspensión (False) o hibernación (True).
# Hibernar.
if not windll.powrprof.SetSuspendState(True, False, False):
print("No se ha podido suspender el sistema.")
El sistema puede ser automáticamente despertado luego de un período de tiempo utilizando las funciones CreateWaitableTimer y SetWaitableTimer. Ejemplo:
from ctypes import windll, byref
from ctypes.wintypes import LARGE_INTEGER
timer = windll.kernel32.CreateWaitableTimerW(None, True, None)
if timer:
# Suspender y despertar luego de 10 segundos.
if windll.kernel32.SetWaitableTimer(timer,
byref(LARGE_INTEGER(-100000000)), 0, None, None, True):
if not windll.powrprof.SetSuspendState(False, False, False):
print("No se ha podido suspender el sistema.")
else:
print("No se pudo crear el timer.")
El segundo argumento de SetWaitableTimer indica el momento en que debe lanzarse el evento para salir de la suspensión y despertar. Se utiliza un número negativo para indicar relatividad, es decir, 10 segundos (expresado en intervalos de 100 nanosegundos, esto es, -segundos * 10000000) a partir del tiempo actual.
¿Qué te parece? Simple, eficaz, ¡y sin módulos de terceros!
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.