Python

無顯示鍵盤監控

  • May 26, 2021

從事一個使用小鍵盤和電子墨水顯示器的項目,該顯示器將在樹莓派零上執行。我已經為 python (pynput, pyxhook) 嘗試了幾個鍵盤包,並編寫/測試了在我的桌面 (ubuntu) 上執行良好的簡點擊鍵記錄器

但是我嘗試在沒有監視器的情況下在 pi 上執行它們兩個庫都死了

DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection refused

我知道至少 pyxhook 有能力捕捉滑鼠移動,所以它為什麼會“需要”訪問監視器是有道理的。但我想要的只是一種在後台執行但沒有連接監視器的程序中擷取鍵盤輸入的方法

庫還可以返回目前具有焦點的視窗作為關鍵事件的一部分,這可能是監視器綁定得如此之深的另一個原因。我試過了

$export DISPLAY=":0"

沒有幫助。

這是pynput的簡單程式碼,可與監視器一起使用,但在無頭執行時不可用(從SSH執行)

#!/usr/bin/env python

from pynput import keyboard

def on_press(key):
   print('Key {} pressed.'.format(key))
   if str(key) == 'Key.esc':
       print('Exiting...')
       return False


with keyboard.Listener(on_press = on_press) as listener:
   listener.join()

有什麼方法可以讓這些工作,或者可能有不同的方法來解決這個問題。

上述程序的完整堆棧跟踪失敗

Traceback (most recent call last):
 File "./keylog.py", line 3, in <module>
   from pynput import keyboard
 File "/usr/local/lib/python2.7/dist-packages/pynput/__init__.py", line 23, in <module>
   from . import keyboard
 File "/usr/local/lib/python2.7/dist-packages/pynput/keyboard/__init__.py", line 49, in <module>
   from ._xorg import KeyCode, Key, Controller, Listener
 File "/usr/local/lib/python2.7/dist-packages/pynput/keyboard/_xorg.py", line 38, in <module>
   from pynput._util.xorg import (
 File "/usr/local/lib/python2.7/dist-packages/pynput/_util/xorg.py", line 38, in <module>
   _check()
 File "/usr/local/lib/python2.7/dist-packages/pynput/_util/xorg.py", line 36, in _check
   display = Xlib.display.Display()
 File "/usr/local/lib/python2.7/dist-packages/Xlib/display.py", line 89, in __init__
   self.display = _BaseDisplay(display)
 File "/usr/local/lib/python2.7/dist-packages/Xlib/display.py", line 71, in __init__
   protocol_display.Display.__init__(self, *args, **keys)
 File "/usr/local/lib/python2.7/dist-packages/Xlib/protocol/display.py", line 90, in __init__
   self.socket = connect.get_socket(name, protocol, host, displayno)
 File "/usr/local/lib/python2.7/dist-packages/Xlib/support/connect.py", line 87, in get_socket
   return mod.get_socket(dname, protocol, host, dno)
 File "/usr/local/lib/python2.7/dist-packages/Xlib/support/unix_connect.py", line 113, in get_socket
   raise error.DisplayConnectionError(dname, str(val))
Xlib.error.DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection refused

好的,我想通了,我想我會發布答案。

pythons鍵盤模組,文件和原始碼在這裡

如“已知限制”部分所述,(儘管我認為這不是限制!)

“為了避免依賴 X,Linux 部分讀取原始設備文件 (/dev/input/input*),但這需要 root。”

所以這確實會帶來安全問題,因為程序現在需要 root 權限,但對我來說這不是問題。

pip install keyboard

簡單的程序

import keyboard
import time

def key_press(key):
   print(key.name)

keyboard.on_press(key_press)

while True:
   time.sleep(1)

引用自:https://unix.stackexchange.com/questions/427345