Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python evdev检测设备已拔出_Python_Python 2.7_Evdev - Fatal编程技术网

Python evdev检测设备已拔出

Python evdev检测设备已拔出,python,python-2.7,evdev,Python,Python 2.7,Evdev,我用的是伟大的“evdev”库来侦听USB条形码读取器输入,我需要检测设备是否突然被拔出/无响应,因为否则读取循环的python脚本将在单个线程上使用100%的cpu,并慢慢开始消耗所有可用内存,这会导致整个系统在一段时间后崩溃 这样做的目的是检测设备何时被拔出,并终止当前脚本,导致主管尝试重新启动它,直到设备重新插入/响应 我用来读取输入的代码如下: devices = map(InputDevice, list_devices()) keys = { 2: 1, 3: 2,

我用的是伟大的“evdev”库来侦听USB条形码读取器输入,我需要检测设备是否突然被拔出/无响应,因为否则读取循环的python脚本将在单个线程上使用100%的cpu,并慢慢开始消耗所有可用内存,这会导致整个系统在一段时间后崩溃

这样做的目的是检测设备何时被拔出,并终止当前脚本,导致主管尝试重新启动它,直到设备重新插入/响应

我用来读取输入的代码如下:

devices = map(InputDevice, list_devices())

keys = {
    2: 1,
    3: 2,
    4: 3,
    5: 4,
    6: 5,
    7: 6,
    8: 7,
    9: 8,
    10: 9,
    11: 0,
}
dev = None
for d in devices:
    if d.name == 'Symbol Technologies, Inc, 2008 Symbol Bar Code Scanner':
        print('%-20s %-32s %s' % (d.fn, d.name, d.phys))
        dev = InputDevice(d.fn)
        break

if dev is not None:
    code = []
    for event in dev.read_loop():
        if event.type == ecodes.EV_KEY:
            if event.value == 00:
                if event.code != 96:
                    try:
                        code.append(keys[event.code])
                    except:
                        code.append('-')
                else:
                    card = "".join(map(str, code))
                    print card

                    code = []
                    card = ""
那么,我该如何以正确的方式进行此操作呢?
我认为可能的一种方法是每隔1-5分钟从cron运行第二个脚本,检查所述设备是否仍然可用,如果现在可用,从某个文件中获取进程id并以这种方式终止进程,但这种方法的问题是,如果设备被拔出,然后在检查之间重新插入“检查程序”当主脚本慢慢崩溃时,脚本认为一切正常-在“拔出”后它不会重新激活。知道自己的工作对别人有用是一种很好的感觉。谢谢你

您肯定应该研究一下linux的设备管理器-udev。每当添加或删除设备时,linux内核都会发出事件。要在Python程序中侦听这些事件,可以使用,这是一个优秀的、基于ctypes的libudev绑定(请参阅上一节)

下面是一个使用
evdev
pyudev
的示例:

import functools
import pyudev

from evdev import InputDevice
from select import select

context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='input')
monitor.start()

fds = {monitor.fileno(): monitor}
finalizers = []

while True:
    r, w, x = select(fds, [], [])

    if monitor.fileno() in r:
        r.remove(monitor.fileno())

        for udev in iter(functools.partial(monitor.poll, 0), None):
            # we're only interested in devices that have a device node
            # (e.g. /dev/input/eventX)
            if not udev.device_node:
                break

            # find the device we're interested in and add it to fds
            for name in (i['NAME'] for i in udev.ancestors if 'NAME' in i):
                # I used a virtual input device for this test - you
                # should adapt this to your needs
                if u'py-evdev-uinput' in name:
                    if udev.action == u'add':
                        print('Device added: %s' % udev)
                        fds[dev.fd] = InputDevice(udev.device_node)
                        break
                    if udev.action == u'remove':
                        print('Device removed: %s' % udev)
                        def helper():
                            global fds
                            fds = {monitor.fileno(): monitor}
                        finalizers.append(helper)
                        break

    for fd in r:
        dev = fds[fd]
        for event in dev.read():
            print(event)

    for i in range(len(finalizers)):
        finalizers.pop()()

你好,乔治,请你仔细看看我的evdev问题好吗?谢谢