Monitoramento de KeyBoard sem exibição

2

Trabalhando em um projeto que usa um pequeno teclado e uma tela de tinta eletrônica que será executada em um raspberry pi Zero. Eu tentei alguns pacotes de teclado para python (pynput, pyxhook) e escrevi / testei simples registradores de pressionamento de tecla que funcionam bem no meu desktop (ubuntu)

No entanto eu tento executá-los no pi sem monitorar ambas as bibliotecas morrem

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

Eu sei que pelo menos o pyxhook tem a capacidade de capturar o movimento do mouse, de modo que faz sentido o porquê de "precisar" de acesso ao monitor. Mas tudo que eu quero é uma maneira de capturar a entrada do teclado em um processo em execução em segundo plano, mas sem monitor conectado

As bibliotecas também podem retornar a janela atual que tem foco como parte do evento principal, e essa pode ser a outra razão pela qual o monitor está tão vinculado.Eu tentei

$export DISPLAY=":0"

não ajudou.

aqui é um código simples para o pynput, funciona com o monitor, mas não quando ele é executado sem a cabeça (executando-o a partir do 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()

Existe alguma maneira de fazer isso funcionar, ou possivelmente uma maneira diferente de abordar isso?

rastreamento de pilha completa do programa acima falhando

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
    
por Chad G 01.03.2018 / 01:29

1 resposta

3

Ok, eu percebi, pensei em postar a resposta.

módulo de teclado pythons, documentos e fontes aqui

como indicado na seção "Limitações Conhecidas" (mesmo que eu não ache que isso seja uma limitação!)

"Para evitar depender de X, o Linux lê os arquivos de dispositivos brutos (/ dev / input / input *), mas isso requer root."

Então, isso traz questões de segurança, obviamente, já que o programa agora precisa de privilégios de root, mas, no meu caso, isso não é um problema.

pip install keyboard

programa simples

import keyboard
import time

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

keyboard.on_press(key_press)

while True:
    time.sleep(1)
    
por 02.03.2018 / 08:13