2009-01-22 16 views

cevap

50

Güncelleme: Açıklamalarda söylediği gibi, Hal son dağıtımlarında desteklenmez, standart şimdi Udev, İşte hitabet döngü ve udev kullanan küçük bir örnektir, ben tarihsel için Hal sürümünü tutmak nedenler.

Bu temelde example in the pyudev documentation olduğunu

, eski sürümleri ile çalışmak için uyarlanmış ve geveze döngü ile, filtre özel ihtiyacı için özelleştirilebilir gerektiğini fark: Hal ve d

import glib 

from pyudev import Context, Monitor 

try: 
    from pyudev.glib import MonitorObserver 

    def device_event(observer, device): 
     print 'event {0} on device {1}'.format(device.action, device) 
except: 
    from pyudev.glib import GUDevMonitorObserver as MonitorObserver 

    def device_event(observer, action, device): 
     print 'event {0} on device {1}'.format(action, device) 

context = Context() 
monitor = Monitor.from_netlink(context) 

monitor.filter_by(subsystem='usb') 
observer = MonitorObserver(monitor) 

observer.connect('device-event', device_event) 
monitor.start() 

glib.MainLoop().run() 

Eski sürüm Minibüs:

D-Bus bağlamaları kullanmak ve DeviceAdded ve DeviceRemoved sinyallere dinleyebilirsiniz. Sadece depolama aygıtlarını seçmek için Eklenen aygıtın özelliklerini kontrol etmeniz gerekir.

İşte küçük bir örnek, yorumları kaldırabilir ve deneyebilirsiniz.

import dbus 
import gobject 

class DeviceAddedListener: 
    def __init__(self): 

Sistem Yöneticisi'ni kullanarak Hal Yöneticisi'ne bağlanmanız gerekir.

 self.bus = dbus.SystemBus() 
     self.hal_manager_obj = self.bus.get_object(
               "org.freedesktop.Hal", 
               "/org/freedesktop/Hal/Manager") 
     self.hal_manager = dbus.Interface(self.hal_manager_obj, 
              "org.freedesktop.Hal.Manager") 

Ve bu durumda DeviceAdded yılında, üzerinde ilgilenen sinyallere bir dinleyici bağlamak gerekir.

 self.hal_manager.connect_to_signal("DeviceAdded", self._filter) 

Yetenekleri temel alarak bir filtre kullanıyorum.Herhangi bir volume kabul eder ve do_something'u arayarak, ihtiyaçlarınız için daha uygun sorguları veya Hal aygıtlarının özellikleriyle ilgili daha fazla bilgiyi bulmak için Hal belgelerini okuyabileceksiniz. hacim ile ilgili bazı bilgiler gösterir

def _filter(self, udi): 
     device_obj = self.bus.get_object ("org.freedesktop.Hal", udi) 
     device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device") 

     if device.QueryCapability("volume"): 
      return self.do_something(device) 

Örnek fonksiyonu: Burada

 def do_something(self, volume): 
     device_file = volume.GetProperty("block.device") 
     label = volume.GetProperty("volume.label") 
     fstype = volume.GetProperty("volume.fstype") 
     mounted = volume.GetProperty("volume.is_mounted") 
     mount_point = volume.GetProperty("volume.mount_point") 
     try: 
      size = volume.GetProperty("volume.size") 
     except: 
      size = 0 

     print "New storage device detectec:" 
     print " device_file: %s" % device_file 
     print " label: %s" % label 
     print " fstype: %s" % fstype 
     if mounted: 
      print " mount_point: %s" % mount_point 
     else: 
      print " not mounted" 
     print " size: %s (%.2fGB)" % (size, float(size)/1024**3) 

if __name__ == '__main__': 
    from dbus.mainloop.glib import DBusGMainLoop 
    DBusGMainLoop(set_as_default=True) 
    loop = gobject.MainLoop() 
    DeviceAddedListener() 
    loop.run() 
+1

Bu kod ile bir hata alıyorum: dbus.exception.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: adı org.freedesktop.Hal herhangi .service dosyaları tarafından sağlanan değildi. Bana yardım edebileceğinizi düşünüyor musunuz? –

+0

@ EtienneLepage-Lepitre Hal şimdi kullanımdan kaldırıldı, genellikle bu çözüm daha fazla çalışmayacak :( – Andy

+1

udev kullanarak çözüm eklendi. –

7

ancak ben sadece (teşekkürler Google!), Bir yardımım olacağını düşünüyorum aşağıdaki iki bağlantılardan baktım, böyle bir programı kendim yazmaya denemedim:

  • dbus-python tutorial (ki konuşur D-Bus) erişmek için Python kullanılacağı hakkında nasıl HAL org.freedesktop.Hal.Manager arayüz hakkında okumak, özellikle

) D-Bus olayları yayınlar ve onun DeviceAdded venasıl bahsediyor

  • HAL 0.5.10 Specification (olayları. :-)

    Bu yardımcı olur umarız!

  • 4

    D-Bus'ın Chris'in bahsettiği gibi çalışacağını düşünüyorum, ancak KDE4 kullanıyorsanız, Katı çerçeveyi KDE4 "Yeni Aygıt Bildiricisi" uygulamasına benzer bir şekilde kullanabilirsiniz.

    Bu uygulama için C++ kaynağı, yeni aygıtları algılamak için Katı'nın nasıl kullanılacağını gösteren here'dur. here gösterildiği gibi, bu kitaplıklara Python bağlamaları için PyKDE4 kullanın.

    2

    5 hatlarında bir çözümdür. Bir dosyaya

    import pyudev 
    
    context = pyudev.Context() 
    monitor = pyudev.Monitor.from_netlink(context) 
    monitor.filter_by(subsystem='usb') 
    
    for device in iter(monitor.poll, None): 
        if device.action == 'add': 
         print('{} connected'.format(device)) 
         # do something very interesting here. 
    

    kaydet bu python monitor.py çalıştırın usb_monitor.py söylüyorlar. Herhangi usb Tak ve cihaz ayrıntılarını pyudev==0.21.0 ile Python 3.5 üzerinde test

    → python usb_monitor.py 
    Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0') connected 
    Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0') connected 
    

    yazdırılır.

    İlgili konular