2012-11-23 19 views
6

Sto usando Ubuntu 12.04. C'è un modo per catturare un evento di sospensione in Python, cioè se il laptop sta per essere sospeso, fai questo ...? La stessa domanda per la cattura dell'evento di chiusura.Come posso catturare un evento di sospensione del sistema in Python?

+1

Questo si occupa con la cattura di eventi di log-out. ma può aiutarti: http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse

+0

grazie ... lo farò guarda gnome.ui – koogee

risposta

5

Penso metodo più semplice sarebbe quella di utilizzare l'interfaccia DBUS python e ascoltare per 'AboutToSleep' e/o di un evento 'Sleeping' sull'interfaccia 'org.freedesktop.UPower'

+0

Grazie. Questo ha funzionato magnificamente. – koogee

+0

Non riesco a trovare il segnale per "Shutdown" in dbus ??? – koogee

+0

non riesce a trovarlo, questo era gestito da HALd, ma ora è obsoleto – Raber

2

È possibile estendere questo codice, è in ascolto per eventi da Acpid, prova a stampare semplicemente la stringa che riceve e generare l'evento che desideri e vedere come appare la stringa.

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
s.connect("/var/run/acpid.socket") 
print "Connected to acpid" 
while 1: 
    for event in s.recv(4096).split('\n'): 
     event=event.split(' ') 
     if len(event)<2: continue 
     print event 
     if event[0]=='ac_adapter': 
      if event[3]=='00000001': #plugged 
       plugged() #Power plugged event 
      else: #unplugged 
       unplugged() #Power unplugged event 
     elif event[0]=='button/power': 
      power_button() #Power button pressed 
     elif event[0]=='button/lid': 
      if event[2]=='open': 
       lid_open() #Laptop lid opened 
      elif event[2]=='close': 
       lid_close() #Laptop lid closed 
+0

grazie. è quello che stavo cercando. da dove puoi ottenere una lista di cosa significano questi codici? per esempio. 000000081? – koogee

+0

Hm nessuna idea onestamente, ho ottenuto quelli generando gli eventi e vedere come appariva la stringa, si potrebbe provare a vedere nella documentazione di acpid, che è il demone che invia quelle stringhe. – LtWorf

+0

questo è strano. Sembra che sto ricevendo solo uno dei segnali di apertura/chiusura del coperchio dopo una sospensione/ripresa. [ 'processore', 'CPU0', '00.000.081', '00000000'] ** [ 'pulsante/coperchio', 'LID0', '00.000.080', '00000003'] ** [ 'processore' , "CPU0", "00000081", "00000000"] ['ac_adapter', 'ADP0', '00000080', '00000000'] ['batteria', 'BAT0', '00000080', '00000001' ] ['processore', 'CPU0', '00000081', '00000000'] – koogee

4

Se qualcuno inciampa sullo stesso problema, ecco il codice:

#!/usr/bin/env python 

import dbus  # for dbus communication (obviously) 
import gobject # main loop 
from dbus.mainloop.glib import DBusGMainLoop # integration into the main loop 

def handle_resume_callback(): 
    print "System just resumed from hibernate or suspend" 

def handle_suspend_callback(): 
    print "System about to hibernate or suspend" 

DBusGMainLoop(set_as_default=True) # integrate into main loob 
bus = dbus.SystemBus()    # connect to dbus system wide 
bus.add_signal_receiver(   # defince the signal to listen to 
    handle_resume_callback,   # name of callback function 
    'Resuming',      # singal name 
    'org.freedesktop.UPower',   # interface 
    'org.freedesktop.UPower'   # bus name 
) 

bus.add_signal_receiver(   # defince the signal to listen to 
    handle_suspend_callback,   # name of callback function 
    'Sleeping',      # singal name 
    'org.freedesktop.UPower',   # interface 
    'org.freedesktop.UPower'   # bus name 
) 

loop = gobject.MainLoop()   # define mainloop 
loop.run()       # run main loop 
+0

con la differenza che solo i sistemi desktop hanno dbus – LtWorf

+2

A partire da versioni più recenti di upower, il segnale è stato spostato su systemd logind, la nuova interfaccia è "org.freedesktop.login1.Manager", il nuovo nome bus è "org.freedesktop.login1" e il nuovo segnale è "PrepareForSleep" con un argomento: True per la sospensione, False per la ripresa. Maggiori informazioni qui: http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-not-seen – totaam