如何在Python中获取外部设备的“挂载点”
我正在尝试在我的树莓派上用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 个回答
根据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'))