Как подключиться к Python для внешних устройств

Я пытаюсь обнаружить все USB-накопители на моем Raspberry Pi в Python. И мне нужны все места их установки. Я проверил APi, но не могу найти, как выбрать точку монтирования для устройств.

bus = dbus.SystemBus()
  ud_manager_obj = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
  ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')
  output=[]
  for dev in ud_manager.EnumerateDevices():
    device_obj = bus.get_object("org.freedesktop.UDisks", dev)
    device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE)

    if device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsRemovable"):
      temp = []
      **## HOW DO I GET THE MOUNTED ON I SEE IN df -h ?**
      output.append(temp)
  return output

Это то, что мне нужно:

Filesystem      Size  Used Avail Use% Mounted on
rootfs          2.6G  2.2G  313M  88% /
/dev/root       2.6G  2.2G  313M  88% /
devtmpfs        112M     0  112M   0% /dev
tmpfs            24M  228K   23M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sdb1        15G  581M   15G   4% **/media/usb0**  <--- I need these
tmpfs            47M     0   47M   0% /run/shm
/dev/mmcblk0p1   56M  9.5M   47M  17% /boot
/dev/sda        3.8G  1.1M  3.8G   1% **/media/usb1**  <--- I need these

Для каждого внешнего USB-устройства мне нужен массив со следующей информацией: [производитель, общий размер, читаемый человеком (ГБ), первый раздел точки монтирования, общий размер в КБ, доступный размер в КБ]

РЕДАКТИРОВАТЬ:

Я изменил свой код на это:

def USBDEVICES():
  bus = dbus.SystemBus()
  ud_manager_obj = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
  ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')
  output=[]
  for dev in ud_manager.EnumerateDevices():
    device_obj = bus.get_object("org.freedesktop.UDisks", dev)
    device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE)

    if device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsRemovable"):
      temp = []
      temp.append(str(device_props.Get('org.freedesktop.UDisks.Device', "DriveVendor")))
      temp.append(str(math.ceil(device_props.Get('org.freedesktop.UDisks.Device', "PartitionSize")/1048576.0)/1000)+' GB')
      temp.append(device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsMounted"))
      temp.append(device_props.Get('org.freedesktop.UDisks.Device','DeviceMountPaths'))
      output.append(temp)
  print output

Я надеялся получить этот вывод:

[['TDKMedia', '15,255 ГБ', True,'/media/usb0'],['Sony', '3,812 ГБ', True,'/media/usb1']

Но вместо этого я получил это:

[['TDKMedia', '15,255 ГБ', dbus.Boolean(False, variant_level=1), dbus.Array([], подпись=dbus.Signature('s'), variant_level=1)], ['USB2. 0', '3,812 ГБ', dbus.Boolean(True, variant_level=1), dbus.Array([dbus.String(u'/media/usb1')], подпись=dbus.Signature('s'), variant_level =1)]]

Нет пути монтирования для USB-накопителя TDKMedia и что-то странное для другого USB-накопителя. Но когда я смотрю на df, он говорит, что TDK смонтирован... :/

Поскольку основной вопрос решен, я открыл новую тему для не смонтированной проблемы: https://stackoverflow.com/questions/24928984/python-dbus-acting-weird


person Bosiwow    schedule 23.07.2014    source источник
comment
Можно ли анализировать вывод mount или df?   -  person Salem    schedule 23.07.2014
comment
Я так думаю, но мне нужны только внешние USB-устройства, и я совершенно не знаю, как это сделать (новый для Linux и Python), и я также хочу, чтобы для каждого внешнего USB-устройства был массив со следующей информацией: [производитель, общий размер, понятный человеку (ГБ), точка монтирования первого раздела, общий размер в КБ, доступный размер в КБ]   -  person Bosiwow    schedule 23.07.2014


Ответы (1)


Согласно org.freedesktop.UDisks.Device документации, для Device существуют следующие свойства:

Свойство DeviceIsMounted

TRUE если устройство смонтировано.

Свойство DeviceMountPaths

Список путей в корневом пространстве имен, где смонтирован корень устройства. Это свойство допустимо, только если DeviceIsMounted равно TRUE.

Увы, я не могу проверить, но тогда должно работать следующее:

if (device_props.Get('org.freedesktop.UDisks.Device', 'DeviceIsRemovable') and
        device_props.Get('org.freedesktop.UDisks.Device', 'DeviceIsMounted')):
    output.extend(device_props.Get('org.freedesktop.UDisks.Device',
                                   'DeviceMountPaths'))
person Antti Haapala    schedule 23.07.2014
comment
Я провожу тест стабильности на своем пи прямо сейчас. Я думаю, что уже попробовал то, что вы предлагаете, и я думаю, что это дало мне /dev/sda и /dev/sdb, но я не уверен на 100% (мне это показалось очень странным, потому что я также прочитал документацию API) Но как только как я проверил это, я дам вам знать. Большое спасибо! - person Bosiwow; 23.07.2014
comment
Вот что я получаю от него: подпись=dbus.Signature('s'), variant_level=1) для другого USB-накопителя я получаю это: dbus.Array([dbus.String(u'/media/usb1')] , подпись=dbus.Signature('s'), variant_level=1) - person Bosiwow; 23.07.2014
comment
Я отредактировал свой вопрос. Очень странные результаты я получаю. :( - person Bosiwow; 23.07.2014