【问题标题】:How to use pynput via ssh on an embedded computer如何在嵌入式计算机上通过 ssh 使用 pynput
【发布时间】:2020-10-30 06:04:00
【问题描述】:

我正在尝试在嵌入式计算机(因此没有显示)上运行使用 pynput 包的模块。我通过 ssh 连接到嵌入式计算机(在 Linux 上),当我尝试运行脚本时出现此错误:

Traceback (most recent call last):
  File "/home/remi/robot-artificial-intelligence/install/ea_maintenance_mode_manager/lib/ea_maintenance_mode_manager/maintenance_mode", line 33, in <module>
    sys.exit(load_entry_point('ea-maintenance-mode-manager==0.1.0', 'console_scripts', 'maintenance_mode')())
  File "/home/remi/robot-artificial-intelligence/install/ea_maintenance_mode_manager/lib/ea_maintenance_mode_manager/maintenance_mode", line 25, in importlib_load_entry_point
    return next(matches).load()
  File "/home/remi/.local/lib/python3.6/site-packages/importlib_metadata/__init__.py", line 105, in load
    module = import_module(match.group('module'))
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/remi/robot-artificial-intelligence/install/ea_maintenance_mode_manager/lib/python3.6/site-packages/ea_maintenance_mode_manager/maintenance_mode.py", line 22, in <module>
    from pynput import keyboard 
  File "/usr/local/lib/python3.6/dist-packages/pynput/__init__.py", line 40, in <module>
    from . import keyboard
  File "/usr/local/lib/python3.6/dist-packages/pynput/keyboard/__init__.py", line 52, in <module>
    from ._xorg import KeyCode, Key, Controller, Listener
  File "/usr/local/lib/python3.6/dist-packages/pynput/keyboard/_xorg.py", line 39, in <module>
    from pynput._util.xorg import (
  File "/usr/local/lib/python3.6/dist-packages/pynput/_util/xorg.py", line 40, in <module>
    _check()
  File "/usr/local/lib/python3.6/dist-packages/pynput/_util/xorg.py", line 38, in _check
    display = Xlib.display.Display()
  File "/usr/local/lib/python3.6/dist-packages/Xlib/display.py", line 89, in __init__
    self.display = _BaseDisplay(display)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/display.py", line 71, in __init__
    protocol_display.Display.__init__(self, *args, **keys)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/protocol/display.py", line 84, in __init__
    name, protocol, host, displayno, screenno = connect.get_display(display)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/support/connect.py", line 73, in get_display
    return mod.get_display(display)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/support/unix_connect.py", line 76, in get_display
    raise error.DisplayNameError(display)
Xlib.error.DisplayNameError: Bad display name ""

我知道这个错误是因为在 Linux 上 pynput 使用 X 来控制键盘并创建了一个环境变量 $DISPLAY。 所以我想在远程运行脚本时设置它(通过 ssh 连接后):

DISPLAY=":0" python3 path_to_my_script/my-script.py

运行此行后,我收到以下错误:

Traceback (most recent call last):
  File "src/ea_maintenance_mode_manager/ea_maintenance_mode_manager/maintenance_mode.py", line 22, in <module>
    from pynput import keyboard 
  File "/usr/local/lib/python3.6/dist-packages/pynput/__init__.py", line 40, in <module>
    from . import keyboard
  File "/usr/local/lib/python3.6/dist-packages/pynput/keyboard/__init__.py", line 52, in <module>
    from ._xorg import KeyCode, Key, Controller, Listener
  File "/usr/local/lib/python3.6/dist-packages/pynput/keyboard/_xorg.py", line 39, in <module>
    from pynput._util.xorg import (
  File "/usr/local/lib/python3.6/dist-packages/pynput/_util/xorg.py", line 40, in <module>
    _check()
  File "/usr/local/lib/python3.6/dist-packages/pynput/_util/xorg.py", line 38, in _check
    display = Xlib.display.Display()
  File "/usr/local/lib/python3.6/dist-packages/Xlib/display.py", line 89, in __init__
    self.display = _BaseDisplay(display)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/display.py", line 71, in __init__
    protocol_display.Display.__init__(self, *args, **keys)
  File "/usr/local/lib/python3.6/dist-packages/Xlib/protocol/display.py", line 166, in __init__
    raise error.DisplayConnectionError(self.display_name, r.reason)
Xlib.error.DisplayConnectionError: Can't connect to display ":0": b'No protocol specified\n'

当我直接连接到嵌入式计算机并输入术语时:

echo $DISPLAY

我收到:0

有没有办法通过 ssh 模拟显示以使用包 pynput ?

谢谢

【问题讨论】:

    标签: python-3.x linux ssh pynput


    【解决方案1】:

    我正在解决类似的问题。我收集 pynput 需要运行 X 服务器并使用 Xvfb 启动虚拟 X 服务器可能会解决,但我还没有工作。

    【讨论】:

    • 也许不是我的地盘,但如果你真的没有答案,你为什么要回答?
    • 这是我试图解决我自己的问题时缺少的一步。不是一个完整的解决方案,但对他来说可能就足够了。
    • 感谢您的回答,即使我没有使用它,我通过使用嵌入式显示器解决了这个问题。所以这个问题仍然悬而未决。
    【解决方案2】:

    一种解决方法是使用sshkeyboard 库而不是pynput,因为它不需要设置X 服务器或DISPLAY 值。它具有一些与 pynput 相同的功能,例如对用户输入做出反应,但它不能模拟按键等。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多