web-dev-qa-db-fra.com

Comment éteindre un ordinateur avec Python

J'ai écrit un script Python qui devrait éventuellement éteindre l'ordinateur. 

Cette ligne en fait partie:

os.system("shutdown /p")

Cela provoque une sorte d'arrêt mais reste sur le panneau de contrôle Windows allumé (où l'utilisateur peut changer d'utilisateur). 

Existe-t-il un moyen d'éteindre complètement l'ordinateur? 

J'ai essayé d'autres méthodes os.system("shutdown ___") sans succès.

Y a-t-il une autre méthode qui pourrait aider?

12
Ben L
import os
os.system('shutdown -s')

Cela fonctionnera pour vous.

12
dudu1791

Pour Linux:

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

ou: si vous voulez un arrêt immédiat sans l'invite Sudo pour le mot de passe, utilisez ce qui suit pour Ubuntu et les distributions similaires:

os.system('systemctl poweroff') 
6
Mtl Dev

En utilisant ctypes , vous pouvez utiliser la fonction ExitWindowsEx pour éteindre l’ordinateur. 

Description de MSDN:

Déconnecte l'utilisateur interactif, arrête le système ou arrête et redémarre le système.


D'abord un code:

import ctypes

user32 = ctypes.WinDLL('user32')

user32.ExitWindowsEx(0x00000008, 0x00000000)

Maintenant l'explication ligne par ligne:

  • Récupère la bibliothèque de ctypes
  • La ExitWindowsEx est fournie par le user32.dll et doit être chargée via WinDLL()
  • Appelez la fonction ExitWindowsEx() et transmettez les paramètres nécessaires.

Paramètres:

Tous les arguments sont des hexadécimaux. 

Le premier argument que j'ai sélectionné:

arrête le système et met le système hors tension. Le système doit prendre en charge la fonctionnalité de mise hors tension.

Il existe de nombreuses autres fonctions possibles voir la documentation pour une liste complète.

Le deuxième argument: _

Le deuxième argument must donne un motif pour l'arrêt, qui est enregistré par le système. Dans ce cas, je le règle pour Other issue mais il y a beaucoup de choix. Voir this pour une liste complète. 

En le faisant sur plusieurs plates-formes:

Cela peut être combiné avec d'autres méthodes pour le rendre multi-plateforme. Par exemple:

import sys

if sys.platform == 'win32':

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

else:

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

Ceci est une fonction dépendante de Windows (bien que Linux/Mac ait un équivalent), mais constitue une meilleure solution que d'appeler os.system() puisqu'un script batch appelé shutdown.bat n'entrera pas en conflit avec la commande (et posera un risque de sécurité entre-temps) .

De plus, cela ne dérange pas les utilisateurs avec un message disant "You are about to be signed out in less than a minute" comme le fait shutdown -s, mais s'exécute silencieusement.

En guise de remarque, utilisez sous-processus sur os.system() (voir Différence entre sous-processus.Popen et os.system )


En note de côté: J'ai construit WinUtils (Windows uniquement), ce qui simplifie un peu la procédure, mais il devrait être plus rapide (et ne nécessite pas de Ctypes) car il est construit en C.

Exemple:

import WinUtils
WinUtils.Shutdown(WinUtils.SHTDN_REASON_MINOR_OTHER)
1
Simon

La seule variante qui fonctionne vraiment pour moi sans aucun problème est:

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