Es casi seguro si desarrollas aplicaciones de escritorio que en alguno de tus proyectos o programas requieras de apagar o reiniciar el sistema. En este artículo conoceremos varios de los métodos para concretarlo. Lamentablemente no hay un único método o función que corra en las múltiples plataformas, pero conociendo las distintas opciones que provee cada una de ellas podrás elaborar tu propio código para hacerlo. Los códigos presentados correrán tanto en Python 2 (ya discontinuado) como en Python 3.
Windows
Bajo Microsoft Windows existen dos métodos para apagar, reiniciar y cerrar la sesión. Uno es utilizando la terminal o línea de comandos; la otra, accediendo al API. Esta última puede concretarse de dos maneras usando Python: vía el módulo ctypes y pywin32.
Solución 1
En esta solución ejecutaremos el comando shutdown
con las correspondientes opciones vía el módulo estándar subprocess
, de la siguiente manera:
import subprocess # Apagar subprocess.run("shutdown -s") # Reiniciar subprocess.run("shutdown -r") # Cerrar sesión subprocess.run("shutdown -l")
import subprocess # Apagar subprocess.call("shutdown -s") # Reiniciar subprocess.call("shutdown -r") # Cerrar sesión subprocess.call("shutdown -l")
Fácil, ¿verdad? Pues no es más que eso. Además, puedes agregar la opción -t
para especificar el tiempo de espera (en segundos) antes de ejecutar la acción. Por ejemplo:
seconds = 30 print("Reiniciar en %d segundos." % seconds) subprocess.run("shutdown -r -t %d" % seconds)
seconds = 30 print("Reiniciar en %d segundos." % seconds) subprocess.call("shutdown -r -t %d" % seconds)
Si por alguna razón deseas abortar la operación, puedes utilizar:
subprocess.run("shutdown -a")
subprocess.call("shutdown -a")
Este comando interrumpe cualquiera de las operaciones que se hayan ejecutado anteriormente usando shutdown
.
Solución 2
Como dijimos antes, podemos también utilizar la API de Windows para realizar las operaciones. La función en cuestión se llama ExitWindowsEx
, y puedes encontrar su documentación en este enlace de la MSDN. Básicamente su estructura es la siguiente:
BOOL ExitWindowsEx(int flags, long reason)
El primer parámetro flags
indica qué tipo de operación se debe realizar. Las que necesitaremos para llevar a cabo apagar, reiniciar y cerrar sesión son EWX_SHUTDOWN
, EWX_REBOOT
y EWX_LOGOFF
, respectivamente. reason
indica la razón por la que se ejecuta la operación. No es de mucha relevancia así que simplemente le daremos como valor 0
.
A continuación ambos métodos para su implementación.
ctypes
El uso del módulo ctypes
sería el camino corto, ya que no requiere instalación adicional de ningún paquete o módulo, se incluye en la librería estándar. Ejemplos:
from ctypes import windll # Constantes para la función ExitWindowsEx EWX_LOGOFF = 0 EWX_SHUTDOWN = 0x00000001 EWX_REBOOT = 0x00000002 # Apagar windll.user32.ExitWindowsEx(EWX_SHUTDOWN, 0) # Reiniciar windll.user32.ExitWindowsEx(EWX_REBOOT, 0) # Cerrar sesión windll.user32.ExitWindowsEx(EWX_LOGOFF, 0)
pywin32
También puedes utilizar el paquete pywin32
, aunque no es de mucha utilidad, en este caso en particular, para realizar estas operaciones. ctypes
resulta fácil y eficaz. Sin embargo, si tu código utiliza pywin32
, seguro querrás mantenerlo consistente (¡lo más importante!) pues en ese caso te será de utilidad el siguiente código de ejemplo.
from win32api import ExitWindowsEx from win32con import EWX_LOGOFF, EWX_SHUTDOWN, EWX_REBOOT # Apagar ExitWindowsEx(EWX_SHUTDOWN, 0) # Reiniciar ExitWindowsEx(EWX_REBOOT, 0) # Cerrar sesión ExitWindowsEx(EWX_LOGOFF, 0)
En este caso no es necesario definir las constantes, pues ya lo están en el módulo win32con
(de win32constants); y la función ExitWindowsEx
se encuentra en win32api
.
Si se obtiene un error de permisos al intentar ejecutar la función, véase Apagar y reiniciar el sistema con la API de Windows.
Linux
En Linux realizamos las operaciones a través del shell, utilizando los comandos shutdown
y reboot
. Al igual que en los ejemplos anteriores, vía el módulo subprocess
.
#!/usr/bin/env python import subprocess # Apagar subprocess.run("shutdown -h") # Reiniciar subprocess.run("shutdown -r") # Opción 1 subprocess.run("reboot") # Opción 2
#!/usr/bin/env python import subprocess # Apagar subprocess.call("shutdown -h") # Reiniciar subprocess.call("shutdown -r") # Opción 1 subprocess.call("reboot") # Opción 2
Vale aclarar que para ejecutar estos comandos se necesitan tener los privilegios necesarios, los de administrador o root
. También puedes especificar el tiempo de espera antes de ejecutar dicha acción. Por ejemplo:
# Reiniciar en... subprocess.run("shutdown -r +1", shell=True) # 1 minuto subprocess.run("shutdown -r +5", shell=True) # 5 minutos subprocess.run("shutdown -r now", shell=True) # Inmediatamente
# Reiniciar en... subprocess.call("shutdown -r +1", shell=True) # 1 minuto subprocess.call("shutdown -r +5", shell=True) # 5 minutos subprocess.call("shutdown -r now", shell=True) # Inmediatamente
O directamente especificar el horario:
# Apagar a las 16:30 subprocess.run("shutdown -h 16:30", shell=True)
# Apagar a las 16:30 subprocess.call("shutdown -h 16:30", shell=True)
La opción shell
permite presionar CTRL
+ C
para abortar, y no tiene nada que ver con el enlace del Shell de Unix aportado anteriormente.
A diferencia de Windows, la función de cerrar la sesión depende del entorno de escritorio que utilice tu distribución de Linux, o el que hayas instalado. Es por esto que no puedo proveer un comando que funcione alrededor de las diversas plataformas. Por ejemplo, en GNOME puedes utilizar:
# Cerrar sesión subprocess.run("gnome-session-quit")
# Cerrar sesión subprocess.call("gnome-session-quit")
¿Conoces algún otro método? ¡Cuéntanos en los comentarios!
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.