如何在 docker 容器中使用“键盘”python 模块而不出现错误?

Ray*_*ams 5 python keyboard python-3.x docker

我正在尝试在 docker 容器中使用 python 模块键盘来测试模拟键盘按下的自动化。然而,该模块在 docker 容器中不断返回错误,而在 ubuntu 虚拟机中却运行良好。

我安装了不同的常用docker容器和不同版本的python。我犯了同样的错误。可悲的是,谷歌并没有像平时那样有帮助。

这是我所做的一个易于重现的版本:

docker run -t -d -u root --name docker_container python:3.7
echo $(docker exec -u root docker_container bash -c 'python3 -m keyboard' )
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误消息:

/usr/local/lib/python3.7/site-packages/keyboard/_nixkeyboard.py:110: UserWarning: Failed to create a device file using `uinput` module. Sending of events may be limited or unavailable depending on plugged-in devices.
  device = aggregate_devices('kbd')
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixcommon.py", line 106, in start_reading
    self.event_queue.put(device.read_event())
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixcommon.py", line 83, in read_event
    data = self.input_file.read(struct.calcsize(event_bin_format))
AttributeError: 'NoneType' object has no attribute 'read'

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixcommon.py", line 106, in start_reading
    self.event_queue.put(device.read_event())
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixcommon.py", line 83, in read_event
    data = self.input_file.read(struct.calcsize(event_bin_format))
AttributeError: 'NoneType' object has no attribute 'read'

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.7/site-packages/keyboard/__main__.py", line 10, in <module>
    keyboard.hook(print_event_json)
  File "/usr/local/lib/python3.7/site-packages/keyboard/__init__.py", line 459, in hook
    append(callback)
  File "/usr/local/lib/python3.7/site-packages/keyboard/_generic.py", line 67, in add_handler
    self.start_if_necessary()
  File "/usr/local/lib/python3.7/site-packages/keyboard/_generic.py", line 35, in start_if_necessary
    self.init()
  File "/usr/local/lib/python3.7/site-packages/keyboard/__init__.py", line 194, in init
    _os_keyboard.init()
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixkeyboard.py", line 114, in init
    build_tables()
  File "/usr/local/lib/python3.7/site-packages/keyboard/_nixkeyboard.py", line 73, in build_tables
    dump = check_output(['dumpkeys', '--keys-only'], universal_newlines=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 395, in check_output
    **kwargs).stdout
  File "/usr/local/lib/python3.7/subprocess.py", line 472, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'dumpkeys': 'dumpkeys'
Run Code Online (Sandbox Code Playgroud)

据我了解,它无法访问 uinput 设备/键盘来转储按键。有没有办法在容器中虚拟模拟键盘以使其工作?

Lin*_*nPy 0

尝试安装以下内容:

apt-get install -y kmod kbd
Run Code Online (Sandbox Code Playgroud)

因为你需要这个才能得到dumpkeys