gpt4 book ai didi

linux - 在 Linux 上弹出 USB 设备

转载 作者:太空狗 更新时间:2023-10-29 12:07:30 26 4
gpt4 key购买 nike

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

Udisks 不允许我使用 DriveEject,因为它不是真正的驱动器,我认为这是一项功能。给出的错误是:

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

U盘documentation提到可弹出属性:

ID_DRIVE_EJECTABLE

Whether the media in the drive is physically ejectable. Only set this to 1 (or 0) if the drive truly uses (or doesn't) ejectable media. In particular, it is not necessary to set this for e.g. iPod or Kindle devices where it is necessary to send a command via eject(1) since the desktop user session will offer this option for removable devices regardless of whether they are ejectable. If this property is not set, a heuristic will be used to determine if the media is ejectable (drives using optical, Zip or Jaz media are considered ejectable).

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

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

有没有合法的方法可以用 Udisks 做这个,如果没有,nautlius 是如何做的?

最佳答案

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

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

关于linux - 在 Linux 上弹出 USB 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com