2012-11-23 41 views
6

我使用的是Ubuntu 12.04。有沒有辦法在Python中捕捉暫停事件,即如果筆記本電腦要暫停,請執行此操作...?捕捉關機事件的同一個問題。如何在Python中捕獲系統暫停事件?

+1

這本書以醒目註銷事件。但可以幫助你:http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse

+0

謝謝...我會看看gnome.ui – koogee

回答

5

我認爲最簡單的方法是使用DBUS python接口 和聽「AboutToSleep」和/或「org.freedesktop.UPower」接口「睡覺」事件

+0

謝謝。這工作很好。 – koogee

+0

我似乎無法找到dbus中「關機」的信號? – koogee

+0

無法找到它爲好,這曾經被哈爾德進行處理,但現在已是過時 – Raber

2

您可以擴展此代碼,它監聽來自acpid的事件,試着打印它接收到的字符串並生成你想要的事件,看看這個字符串是什麼樣的。

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

謝謝。它正在尋找什麼。順便說一句,你在哪裏可以得到這些代碼是什麼意思?例如000000081? – koogee

+0

哼不知道說實話,我通過生成的事件,看到了字符串是什麼樣子,你可以嘗試的acpid的文件,這是守護程序發送這些字符串中看到了這些。 – LtWorf

+0

這很奇怪。看起來我在暫停/恢復後只能獲得蓋子打開/關閉信號中的一個。 [ '處理器', 'CPU0', '00000081', '00000000'] ** [ '按鈕/蓋', 'LID0', '00000080', '00000003'] ** [ '處理器' ['battery','BAT0','00000080','0000000'] ['ac_adapter','ADP0','00000080','00000000'] ['battery' ] [「處理器」,「CPU0」,「00000081」,「00000000」] – koogee

4

如果有一個人對同樣的問題絆倒,下面的代碼:

#!/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

除了只有桌面系統已經DBUS – LtWorf

+2

與微功耗的新版本開始,信號已經轉移到systemd logind,新的界面是「org.freedesktop.login1.Manager」,新的總線名稱是「org.freedesktop.login1」並且新的信號是「PrepareForSleep」,其參數爲:掛起爲真,爲恢復爲False。更多信息在這裏:http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-notseseen – totaam