Cómo apagar una computadora usando Python

He escrito un script en Python que debería apagar la computadora.

Esta línea es parte de ella:

os.system("shutdown /p") 

Hace algún tipo de apagado pero permanece en el panel de control de Windows (donde el usuario puede cambiar los usuarios de la computadora).

¿Hay una manera de apagar completamente la computadora?

He intentado otros os.system("shutdown ___") sin éxito.

¿Hay algún otro método que pueda ayudar?

 import os os.system('shutdown -s') 

Esto funcionará para usted.

Para Linux:

 import os os.system('sudo shutdown now') 

o: si desea un cierre inmediato sin solicitud de contraseña de sudo , use lo siguiente para Ubuntu y distribuciones similares:

 os.system('systemctl poweroff') 

La única variante que realmente funciona para mí sin ningún problema es:

 import os os.system('shutdown /p /f') 

Usando ctypes puede usar la función ExitWindowsEx para apagar la computadora.

Descripción de MSDN:

Cierra la sesión del usuario interactivo, apaga el sistema o lo apaga y lo reinicia.


Primero un código:

 import ctypes user32 = ctypes.WinDLL('user32') user32.ExitWindowsEx(0x00000008, 0x00000000) 

Ahora la explicación línea por línea:

  • Obtener la biblioteca de ctypes
  • El ExitWindowsEx es proporcionado por el user32.dll y necesita ser cargado vía WinDLL()
  • Llame a la ExitWindowsEx() y pase los parámetros necesarios.

Parámetros:

Todos los argumentos son hexadecimales.

El primer argumento que seleccioné:

apaga el sistema y apaga la alimentación. El sistema debe ser compatible con la función de apagado.

Hay muchas otras funciones posibles, consulte la documentación para obtener una lista completa.

El segundo argumento:

El segundo argumento debe dar una razón para el cierre, que es registrado por el sistema. En este caso, lo configuro para Other issue pero hay muchos para elegir. Vea esto para una lista completa.

Haciéndolo multiplataforma:

Esto se puede combinar con otros métodos para hacerlo multiplataforma. Por ejemplo:

 import sys if sys.platform == 'win32': import ctypes user32 = ctypes.WinDLL('user32') user32.ExitWindowsEx(0x00000008, 0x00000000) else: import os os.system('sudo shutdown now') 

Esta es una función dependiente de Windows (aunque Linux / Mac tendrá un equivalente), pero es una solución mejor que llamar a os.system() ya que un script por lotes llamado shutdown.bat no entrará en conflicto con el comando (y causa un peligro de seguridad en mientras tanto).

Además, no molesta a los usuarios con un mensaje que dice "You are about to be signed out in less than a minute" shutdown -s "You are about to be signed out in less than a minute" como lo hace shutdown -s , pero se ejecuta en silencio.

Como nota al margen, use subprocess over os.system() (vea Diferencia entre subprocess.Popen y os.system )


Como nota al margen: construí WinUtils (solo Windows) que simplifica esto un poco, sin embargo, debería ser más rápido (y no requiere Ctypes) ya que está construido en C.

Ejemplo:

 import WinUtils WinUtils.Shutdown(WinUtils.SHTDN_REASON_MINOR_OTHER) 

Este código de Python puede hacer la escritura:

 import os os.system('sudo shutdown -h now')