Tôi đang sử dụng ubuntu 12.04. Có cách nào để bắt sự kiện tạm ngừng bằng Python, tức là nếu máy tính xách tay sắp ngừng hoạt động, hãy thực hiện việc này ...? Cùng một câu hỏi để bắt sự kiện tắt máy.Làm thế nào tôi có thể bắt được một sự kiện đình chỉ hệ thống bằng Python?
Trả lời
tôi nghĩ rằng phương pháp đơn giản nhất là nên sử dụng giao diện DBUS python và lắng nghe cho 'AboutToSleep' và/hoặc 'Ngủ' sự kiện trên giao diện 'org.freedesktop.UPower'
Bạn có thể mở rộng mã này, nó lắng nghe cho các sự kiện từ acpid, cố gắng chỉ in chuỗi nó nhận và tạo ra sự kiện bạn muốn và xem chuỗi trông như thế nào.
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
cảm ơn. những gì tôi đang tìm kiếm. btw nơi bạn có thể nhận được một danh sách những gì các mã này có nghĩa là gì? ví dụ. 000000081? – koogee
Hm không có ý tưởng một cách trung thực, tôi có những người bằng cách tạo ra các sự kiện và xem những gì chuỗi trông giống như, bạn có thể thử xem trong tài liệu của acpid, đó là daemon gửi những chuỗi. – LtWorf
điều này thật lạ. Có vẻ như tôi chỉ nhận được một trong những dấu hiệu mở/đóng nắp sau khi tạm ngưng/tiếp tục. [ 'xử lý', 'CPU0', '00.000.081', '00000000'] ** [ 'nút/nắp', 'LID0', '00.000.080', '00.000.003'] ** [ 'xử lý' , 'CPU0', '00000081', '00000000'] ['ac_adapter', 'ADP0', '00000080', '00000000'] ['pin', 'BAT0', '00000080', '00000001' ] ['bộ xử lý', 'CPU0', '00000081', '00000000'] – koogee
Nếu một ai tình cờ trên cùng một vấn đề, đây là các mã:
#!/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
ngoại trừ chỉ các hệ thống máy tính để bàn có dbus – LtWorf
Bắt đầu với phiên bản mới hơn của người lên máy, tín hiệu đã chuyển sang log hệ thống, giao diện mới là "org.freedesktop.login1.Manager", tên bus mới là "org.freedesktop.login1" và tín hiệu mới là "PrepareForSleep" với một đối số: True for suspending, False để tiếp tục. Thông tin thêm tại đây: http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-not-seen – totaam
này giao dịch với bắt sự kiện log-out. nhưng có thể giúp bạn: http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse
cảm ơn ... tôi sẽ nhìn vào gnome.ui – koogee