Apagar, reiniciar y cerrar sesión en Windows y Linux

Apagar, reiniciar y cerrar sesión en Windows y Linux

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.

Deja una respuesta