dbus-python buggy?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi,

Hab ein kleines Problem mit dbus-python und udisk2 und zwar stimmt irgendwas mit der Kommunikation nicht.

Hatte dazu das kleine Scrip hier gefunden (Siehe unten), was auch klappt bis ich "/dev/sdc" erreichen sollte.

Dann springt das ganze von "block_devices" auf "drives" weshalb auch immer, obwohl klar mit "org.freedesktop.UDisks2.Block" und nicht mit "org.freedesktop.UDisks2.Drive" kommuniziert wird.

Man beachte die "print k" Ausgabe.

Kann mir einer klären was zur Hölle da schief läuft?

Code: Alles auswählen

#!/usr/bin/python2.7
# coding: utf-8
import dbus


def get_usb():
    devices = []
    bus = dbus.SystemBus()
    ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2')
    om = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager')
    for k,v in om.GetManagedObjects().iteritems():
        print k
        drive_info = v.get('org.freedesktop.UDisks2.Block', {})
        device = bytearray(drive_info.get('Device')).replace(b'\x00', b'')
        devices.append(device)

Code: Alles auswählen

==================== RESTART: /home/pycoder/dbus-test.py ====================
/org/freedesktop/UDisks2/block_devices/sdb1
/org/freedesktop/UDisks2/block_devices/sda
/org/freedesktop/UDisks2/block_devices/sr0
/org/freedesktop/UDisks2/block_devices/sda1
/org/freedesktop/UDisks2/block_devices/sda2
/org/freedesktop/UDisks2/block_devices/sda3
/org/freedesktop/UDisks2/block_devices/sda4
/org/freedesktop/UDisks2/block_devices/sdb3
/org/freedesktop/UDisks2/block_devices/sdb2
/org/freedesktop/UDisks2/drives/Samsung_SSD_840_EVO_1TB_S1D9NSAF720159W

Traceback (most recent call last):
  File "/home/pycoder/dbus-test.py", line 52, in <module>
    dev = get_usb()
  File "/home/pycoder/dbus-test.py", line 14, in get_usb
    device = bytearray(drive_info.get('Device')).replace(b'\x00', b'')
TypeError: 'NoneType' object is not iterable
Zuletzt geändert von Anonymous am Dienstag 22. August 2017, 14:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@AngelusNoctis: `GetManagedObjects` liefert alle von `UDisk2` verwalteten Objekte und das sind nun mal `drives` *und* `block_devices`. Und dann versuchst Du ganz klar *alle* als `Block` anzusprechen — auch die Drives die dieses Interface nicht implementieren.
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Oh, mein Fehler.

Hab mich eben noch nicht so richtig mit D-Bus beschäftigt und fand das Script bei stackoverflow.

Hätte es mehr anschauen müssen.

Danke :)
Antworten