在Linux上popupUSB设备

我在python中通过dbus使用Udisk来卸载一个USB设备(在这个例子中是一个Kindle),但是我想向它发送popup信号,因为这会将Kindle从USB模式退回到它通常的界面。

Udisk不会让我DriveEject,因为它不是一个实际的驱动器,我收集这是一个function。 给出的错误是:

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

Udisks 文档提到可抛出的属性:

ID_DRIVE_EJECTABLE

驱动器中的介质是否是物理可popup的。 如果驱动器真正使用(或不)可popup介质,只设置为1(或0)。 尤其是,对于例如需要通过popup(1)发送命令的iPod或Kindle设备,这不是必需的,因为桌面用户会话将为可移动设备提供这个选项,而不pipe它们是否可popup。 如果未设置此属性,将使用启发式方法确定介质是否可popup(使用光盘驱动器,Zip或Jaz介质被视为可popup)。

但不解释如何从桌面用户会话做到这一点。

(Nautilus可以让我从桌面shellpopup,popup的shell命令将会卸载,但不会在没有sudo的情况下将popup信号发送到设备)

有没有什么合法的办法可以和Udisk进行呢?如果不是的话,Nautlius怎么去做呢?

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

解决方法是首先使用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([])