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?
risposta
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'
È 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
grazie. è quello che stavo cercando. da dove puoi ottenere una lista di cosa significano questi codici? per esempio. 000000081? – koogee
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
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
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
con la differenza che solo i sistemi desktop hanno dbus – LtWorf
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
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
grazie ... lo farò guarda gnome.ui – koogee