如何在Python中获取外部设备的“挂载点”

1 投票
1 回答
2816 浏览
提问于 2025-04-18 14:27

我正在尝试在我的树莓派上用Python检测所有的USB闪存驱动器,并想获取它们的挂载位置。我查看了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设备,我想要一个数组,里面包含以下信息: [制造商,总大小(人类可读,单位为GB),第一个分区的挂载点,总大小(单位为KB),可用大小(单位为KB)]

编辑:

我把我的代码改成了这样:

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 GB', True, '/media/usb0'], ['Sony', '3.812 GB', True, '/media/usb1']]

但我得到的是这个:

[['TDKMedia', '15.255 GB', dbus.Boolean(False, variant_level=1), dbus.Array([], signature=dbus.Signature('s'), variant_level=1)], ['USB2.0', '3.812 GB', dbus.Boolean(True, variant_level=1), dbus.Array([dbus.String(u'/media/usb1')], signature=dbus.Signature('s'), variant_level=1)]]

TDKMedia USB驱动器没有挂载路径,而另一个USB驱动器的输出有些奇怪。 但是当我查看df命令时,它显示TDK已经挂载了... :/

由于主要问题已经解决,我为未挂载的问题开了一个新话题: https://stackoverflow.com/questions/24928984/python-dbus-acting-weird

1 个回答

1

根据org.freedesktop.UDisks.Device的文档,一个Device(设备)有以下几个属性:

首先是DeviceIsMounted属性

如果设备已经被挂载,这个属性的值是TRUE

接下来是DeviceMountPaths属性

这是一个路径列表,显示设备的根目录被挂载在了哪些地方。这个属性只有在DeviceIsMountedTRUE时才有效。

虽然我无法确认,但以下内容应该可以正常工作:

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'))

撰写回答