【问题标题】:How to get "mounted on" in python for external devices如何在 python 中为外部设备“安装”
【发布时间】:2014-09-14 19:47:28
【问题描述】:

我正在尝试在 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 设备,我想要一个包含以下信息的数组: [manufacturer,total size Human readable (GB), mount point first partition, total size in KB,available size in 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

【问题讨论】:

  • 解析mountdf 的输出是一个选项吗?
  • 我想是的,但我只需要外部 USB 设备,我完全不知道如何做到这一点(Linux 和 python 的新手),我还希望每个外部 USB 设备都有一个具有以下信息的数组:[制造商,总大小人类可读(GB),挂载点第一个分区,总大小(KB),可用大小(KB)]

标签: python usb mount


【解决方案1】:

根据org.freedesktop.UDisks.Device documentationDevice有以下属性:

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

【讨论】:

  • 我现在正在对我的 pi 进行稳定性测试。我想我已经尝试了你的建议,我认为它给了我 /dev/sda 和 /dev/sdb,但我不是 100% 确定(我觉得这很奇怪,因为我也阅读了 api 文档)但是尽快我已经测试过了,我会告诉你的。非常感谢!
  • 这是我从中得到的:signature=dbus.Signature('s'), variant_level=1) 对于另一个 USB 记忆棒我得到这个:dbus.Array([dbus.String(u '/media/usb1')], 签名=dbus.Signature('s'), variant_level=1)
  • 我已经编辑了我的问题。我得到了非常奇怪的结果。 :(
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2013-04-16
  • 2012-03-09
  • 2016-02-05
相关资源
最近更新 更多