Un/bind 通过 Python 的 USB 设备(最好通过 PyUSB)

Un/bind a USB device via Python (preferably by PyUSB)

有没有 pyusb 解除绑定 USB 设备的方法?

我知道使用以下 bash USB 未绑定。

DEVICE=$(grep 064f /sys/bus/usb/devices/*/idVendor | tr '/' ' ' | awk '{ print  }')
/bin/bash -c "echo $DEVICE >/sys/bus/usb/drivers/usb/unbind"

但出于各种原因,我喜欢从 bash 转移到 Python,并且最好避免维护我习惯的、复杂的逻辑。所以使用现有的库对我来说很有意义。

中的选定答案建议 detach_kernel_driver 为此目的工作,但我没有在我的环境中看到这种情况;它确实卸载了指定 USB 设备中的卷(通过观察 USB 上的磁盘 space 在 lsblk 的输出中消失来确认)但我仍然看到 OS 检测到 USB 设备。

$ ipython
In [7]: import usb
   ...: dev = usb.core.find(idVendor=0x064f, idProduct=0x03f3)
In [8]: dev.detach_kernel_driver(0)
$ watch lsusb
:
Bus 002 Device 043: ID 064f:03f3 WIBU-Systems AG CmStick/M (article no. 1011)

环境

Linux(在撰写本文时,Ubuntu 16.04(我知道 EoLed)或 18.04。但环境不应成为限制因素。无论版本如何,都可以使用可用的解决方案。


更新:我的用例需要模拟移除 USB 设备。我们对通常称为 un/bind 的操作很满意,对实现 un/bind.

bash 解决方案也很满意

PyUSB 代码的快速 search 使它看起来好像没有绑定或解除绑定的功能。所以 PyUSB 不是答案。

但是,您不需要使用Bash来解绑设备。 Python 有一个标准库,可以让你获取目录列表、读取文件和写入文件,所以你可以只使用 Python 的标准库而不是 Bash。

本来想关闭 OP 但找不到合适的理由所以自己回答。

pyusb#399 I found I was misunderstood. Using detach_kernel_driver as suggested in 维护者的帮助下,我总结自己也为我的目的工作。