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



Versión: 2.6+, 3.x

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 daré a conocer varios de los métodos para concretarlo (aunque de seguro habrá más). 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.

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 subprocess, de la siguiente manera:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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.call("shutdown -r -t %d" % seconds)

Si por alguna razón deseas abortar la operación, puedes utilizar:

subprocess.call("shutdown -a")

Este comando interrumpe cualquiera de las operaciones que se hayan ejecutado anteriormente usando shutdown.

Solución 2

Como dije anteriormente, 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:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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.

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
# -*- coding: utf-8 -*-

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.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.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.call("gnome-session-quit")

¡Danos a conocer tus métodos!



Deja una respuesta