【问题标题】:On macOS, is it possible to reserve input from an HID for a python program?在 macOS 上,是否可以为 python 程序保留来自 HID 的输入?
【发布时间】:2019-01-11 16:27:49
【问题描述】:

我想为 Python 3.6 程序提供对来自 LASER 条形码(点和触发类型)阅读器的输入的独占访问权限;也就是说,无论 UI 焦点如何,其他程序都不应该从阅读器那里获得输入(因为 python 程序已经只为自己声明了设备。)

我已经能够在使用 Python 3.6 和 pyusb 库的 Linux 机器上很好地做到这一点,但是我无法在 macOS 中复制该功能,我收到一条错误消息,指出我没有足够的权限。

这实际上也发生在 Linux 中,但很容易通过将当前用户添加到 dialout 组并在 /etc/udev/rules.d/99-usb.rules 中创建 udev 规则文件来授予具有此规则的用户或组权限:

SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", GROUP="dialout", MODE="0666"

如何在 macOS 上授予同等权限?

示例代码在 Linux 上完全符合我的要求,但在 macOS 上完全失败:

import usb.core
import usb.util
device = usb.core.find(idVendor=0x0519, idProduct=0x2017)
if device.is_kernel_driver_active(0):
    device.detach_kernel_driver(0)
    print("Kernel driver detached")
else:
    print("Kernel driver already detached")
try:
    device.set_configuration()
    device.reset()
    usb.util.claim_interface(device, 0) # error happens here
    print("Claimed device")
except Exception as e:
    print("Error when claiming device", e)
    sys.exit(1)

根据我在网上找到的信息,macOS 似乎没有授予此访问权限的等效机制。

macOS 上的错误:

[Errno 13] Access denied (insufficient permissions)

【问题讨论】:

  • 如果你使用sudo YourScript 运行?
  • 既然是HID设备,就要采取内核相关的措施,如果改成串口设备,会不会自动变成独享设备?
  • 我忘了提到它必须作为人们无法直接访问的服务运行,因此 sudo 或以 root 身份运行并不是一个真正的选择。
  • @kunif 如何将其从 HID 转换为串行端口设备?我愿意尝试不同的方法来访问阅读器,只是需要更多的指针。
  • @Jonathan Acosta,对于大多数扫描仪,设置条形码以更改模式在用户手册等中都有所写。请使用它来从键盘输入模式更改为串口模式。

标签: macos barcode-scanner pyusb


【解决方案1】:

根据我在最初发布此问题后了解到的情况,您可以保留任何 USB 设备的输入,只要它支持“串行模式”,如果您的设备可以切换到此模式模式,然后操作系统可以将其与默认 HID 模式区别对待,您将能够获取它的输入,甚至是独占。

免责声明:

在发布此答案时,我还没有机会对此进行全面测试。只是想快速更新任何感兴趣的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多