Stackoverflow podcast'i otomatik olarak oynatıcıma kopyalamak için Linux'ta Amarok için bir Python betiği yazmak istiyorum. Oynatıcıyı bağladığımda, sürücüyü monte eder, bekleyen podcast'leri kopyalayabilir ve oynatıcıyı çıkarır. "Eklenti" etkinliğini nasıl dinleyebilirim? Hald'a baktım ama iyi bir örnek bulamadım.Linux'taki 'usb aygıt takılı' olaylarını Python'da nasıl dinleyebilirim?
cevap
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()
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
Bu yardımcı olur umarız!
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.
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.
- 1. Android USB aygıt algılaması
- 2. USB Aygıt Bağlandı
- 3. nasıl alabilirim (takılı) tüm USB sürücüler
- 4. Bir USB aygıtının hangi bağlantı noktasına takılı olduğunu nasıl anlarım?
- 5. USB aygıt arabirimi GUID nasıl alınır?
- 6. C# USB aygıtını algıla ClassCode (usb aygıt türü)
- 7. Belirli bir USB aygıtının takılı olup olmadığını nasıl kontrol ederim?
- 8. C'ye takılı USB flash sürücünün boyutunu nasıl bulabilirim?
- 9. USB arabirimi talep edilemiyor (Aygıt meşgul veya kaynak meşgul)
- 10. Konsol etkinliklerini symfony'de nasıl dinleyebilirim?
- 11. OSX'te takılı depolama aygıtları nasıl bulunur?
- 12. Bağlı USB aygıtlarının sınıflandırması
- 13. Seri Bağlantı Noktasına USB
- 14. Nümerik dizi veya pandalarla pythonda rutini sadeleştirme
- 15. Laravel 5 testlerinde olayları nasıl dinleyebilirim?
- 16. UIWebView'de gezinme değişikliklerini doğru olarak nasıl dinleyebilirim?
- 17. javascript ile xhr isteklerini kolayca nasıl dinleyebilirim?
- 18. Android'de SD kart montajını nasıl dinleyebilirim?
- 19. Mac üzerinde Python'da bir fare olayı nasıl dinleyebilirim?
- 20. Android USB HID Aygıtı
- 21. Linux'ta bir USB aygıtından iletileri nasıl engellerim?
- 22. USB güç durumunun algılanması
- 23. Android aygıt yönünü komut satırından değiştirme
- 24. JavaScript, WinRT olaylarını nasıl çeker?
- 25. Windows altında USB aygıtı yeniden bağlanma sorunu nasıl verilir
- 26. Kullanılabilir USB aygıtlarını bulun Mac OS X
- 27. UWP uygulamasında takılı kulaklık jakı nasıl algılanır?
- 28. Akıllı kart takılı olup olmadığını nasıl anlarım?
- 29. Aygıt, libGDX
- 30. USB olaylarını tespit etmek için bir Qt çözümü var mı (ekleme ve çıkarma)?
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? –
@ EtienneLepage-Lepitre Hal şimdi kullanımdan kaldırıldı, genellikle bu çözüm daha fazla çalışmayacak :( – Andy
udev kullanarak çözüm eklendi. –