2

我在 python 中通过 dbus 使用 Udisks 来卸载 USB 设备(在本例中为 Kindle),但我想向它发送弹出信号,因为这会将 Kindle 从 USB 模式踢回其通常的界面。

Udisks 不会让我 DriveEject,因为它不是真正的驱动器,我认为这是一个功能。给出的错误是:

dbus.exceptions.DBusException: org.freedesktop.UDisks.Error.Failed: Device is not a drive

Udisks文档提到了可弹出属性:

ID_DRIVE_EJECTABLE

驱动器中的介质是否可以物理弹出。仅当驱动器真正使用(或不使用)可弹出媒体时,才将其设置为 1(或 0)。特别是,对于需要通过弹出(1) 发送命令的 iPod 或 Kindle 设备等,不需要设置此选项,因为桌面用户会话将为可移动设备提供此选项,无论它们是否可弹出。如果未设置此属性,将使用启发式方法来确定介质是否可弹出(使用光盘、Zip 或 Jaz 介质的驱动器被视为可弹出)。

但没有解释如何从桌面用户会话中执行此操作。

(Nautilus 可以让我从桌面 shell 中很好地弹出。'eject' shell 命令将卸载但不会在没有 sudo 的情况下将弹出信号发送到设备)

有没有任何合法的方法可以用 Udisk 做到这一点,如果没有,那 nautlius 是如何做到的?

4

1 回答 1

3

所以事实证明我试图弹出分区,而不是驱动器本身,因此“设备不是驱动器错误”。(也就是说,在 /dev/sdc1 而不是 /dev/sdc 上调用 udisks 弹出)

解决方案是首先使用 FilesystemUnmount() 卸载分区,然后使用“PartitionSlave”属性找到父驱动器,并在此调用 DriveEject()。

在带有 dbus 的 python 中,假设您已经有一个来自 Udisks 的设备对象用于分区,这看起来像:

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([])
于 2011-02-25T20:18:25.130 回答