Używam Ubuntu 12.04. Czy istnieje sposób na przechwycenie zdarzenia zawieszenia w Pythonie, tzn. Czy laptop zawiesi, zrób to ...? To samo pytanie dotyczące przechwytywania zdarzenia zamknięcia.Jak mogę złapać zdarzenie zawieszenia systemu w Pythonie?
Odpowiedz
myślę najprostszą metodą będzie użycie DBUS python interfejsu i nasłuchiwać „AboutToSleep” i/lub „Śpiąca” zdarzenia na interfejsie „org.freedesktop.UPower”
Można rozszerzyć ten kod, to nasłuchuje Zdarzenia z acpid, spróbuj po prostu wydrukować ciąg, który otrzymuje i wygeneruj zdarzenie, które chcesz i zobacz, jak wygląda ciąg.
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
dzięki. to, czego szukałem. btw gdzie można uzyskać listę tego, co oznaczają te kody? na przykład 000000081? – koogee
Hm nie mam pojęcia szczerze, dostałem je poprzez generowanie zdarzeń i zobaczenie jak ten łańcuch wyglądał, możesz spróbować zobaczyć w dokumentacji acpid, który jest demonem wysyłającym te struny. – LtWorf
to jest dziwne. Wygląda na to, że otrzymuję tylko jeden z sygnałów otwarcia/zamknięcia pokrywy po zawieszeniu/wznowieniu. [ 'procesor', 'CPU0', '00000081', '00000000'] ** [ '/ przycisk pokrywa', 'LID0', '00000080', '00000003'] ** [ 'procesor' , 'CPU0', '00000081', '00000000'] ['ac_adapter', 'ADP0', '00000080', '00000000'] ['battery', 'BAT0', '00000080', '00000001' ] ['procesor', 'CPU0', '00000081', '00000000'] – koogee
Jeśli ktoś natknie się na ten sam problem, oto kod:
#!/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
oprócz tego, że tylko systemy stacjonarne mają dbus – LtWorf
Począwszy od nowszych wersji upower, sygnał został przeniesiony do loginu systemd, nowy interfejs to "org.freedesktop.login1.Manager", nowa nazwa magistrali to "org.freedesktop.login1" a nowym sygnałem jest "PrepareForSleep" z argumentem: True dla zawieszenia, false dla wznowienia. Więcej informacji tutaj: http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-not-seen – totaam
ten dotyczy połowu zdarzenie wylogowanie. ale może ci pomóc: http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse
dzięki ... będę spójrz na gnome.ui – koogee