我在python中通过dbus使用Udisks卸载USB设备(在这种情况下是Kindle),但是我想向它发送弹出信号,因为这会将Kindle从USB模式恢复到通常状态接口
Udisks不会让我DriveEject,因为它不是一个真正的驱动器,我认为这是一个功能。给出的错误是:
dbus.exceptions.DBusException: org.freedesktop.UDisks.Error.Failed: Device is not a drive
Udisks documentation提到了可弹出属性:
ID_DRIVE_EJECTABLE
驱动器中的介质是否正常 物理弹射。只将此设置为 1(或0)如果驱动器真正使用(或 没有)可弹出的媒体。在 特别是,没有必要设置 这对于例如iPod或Kindle设备 哪里有必要发送 自桌面起通过eject(1)命令 用户会话将提供此选项 适用于可移动设备 它们是否可以弹射。如果这 属性没有设置,一个启发式的意志 用于确定媒体是否 可弹出(使用光学驱动器,Zip 或Jaz媒体被考虑 可弹出)。
但没有解释如何从桌面用户会话中执行此操作。
(Nautilus让我从桌面shell中弹出很好.'reject'shell命令将卸载,但不会在没有sudo的情况下将弹出信号发送到设备)
有没有合法的方法可以使用Udisks,如果没有,nautlius如何去做呢?
答案 0 :(得分:3)
所以事实证明我试图弹出分区,而不是驱动器本身,因此“设备不是驱动器错误”。 (也就是说,调用udisks弹出/ dev / sdc1而不是/ dev / sdc)
解决方案是首先使用FilesystemUnmount()卸载分区,然后使用“PartitionSlave”属性找到父驱动器,并在此处调用DriveEject()。
在使用dbus的python中,假设你已经有来自Udisks的设备对象用于parition,这看起来像是:
dev_if = dbus.Interface(device_object, 'org.freedesktop.UDisks.Device')
dev_if.FilesystemUnmount([])
device_props = dbus.Interface(device_object, dbus.PROPERTIES_IFACE)
drive = device_props.Get('org.freedesktop.UDisks.Device', "PartitionSlave")
drive_obj = self.bus.get_object("org.freedesktop.UDisks", drive)
drive_if = dbus.Interface(drive_obj, 'org.freedesktop.UDisks.Device')
drive_if.DriveEject([])