logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 23-11-2015 15:19:32

Elzen
Modérateur
Distrib. : Debian Sid GNU/Linux
Noyau : amd64 (à jour le vendredi)
(G)UI : Touhy
Inscription : 01-07-2014

[Résolu] Simuler une entrée clavier

Salut,

c'est, globalement, un soucis de programmation; mais le soucis sur lequel je butte présentement semble plutôt être côté système, donc je poste ça ici quand même; merci de déplacer si vous jugez que ce n'est pas au bon endroit (ça dépendra sans doute pas mal des réponses apportées).

Je cherche à faire un script python pour envoyer des actions clavier automatiquement.
J'ai commencé par faire ça avec python-xlib et xtest, et ça marche plutôt bien, mais certaines applications (Mednafen, par exemple) ne semblent pas lire ce type d'événements par X, et donc ça ne marche pas dans ce cas-là.

À force de farfouiller, j'ai finis par tomber sur uinput qui semble permettre le même genre de choses, mais en causant directement avec le noyau, donc potentiellement plus compatible. Il semble y avoir un paquet python utilisant la chose, même s'il semble ne pas être empaqueté dans Debian pour l'instant.

J'ai donc tenté de l'installer, mais ça ne semble pas marcher:

elzen@fadreils: tmp$ python test.py
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    device = uinput.Device([uinput.KEY_H, uinput.KEY_E, uinput.KEY_L, uinput.KEY_O])
  File "/opt/pylibs/uinput/__init__.py", line 161, in __init__
    self.__uinput_fd = _libsuinput.suinput_open()
  File "/opt/pylibs/uinput/__init__.py", line 64, in _error_handler
    raise OSError(code, os.strerror(code))
OSError: [Errno 19] No such device



Bien que /dev/uinput existe, je me suis dit que c'était peut-être un soucis de module non chargé, donc un petit coup de modprobe, et, effectivement, ça change des choses. Du moins, ce n'est plus la même erreur:

elzen@fadreils: tmp$ su -c "modprobe uinput"
Mot de passe :
elzen@fadreils: tmp$ python test.py
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    device = uinput.Device([uinput.KEY_H, uinput.KEY_E, uinput.KEY_L, uinput.KEY_O])
  File "/opt/pylibs/uinput/__init__.py", line 161, in __init__
    self.__uinput_fd = _libsuinput.suinput_open()
  File "/opt/pylibs/uinput/__init__.py", line 64, in _error_handler
    raise OSError(code, os.strerror(code))
OSError: [Errno 13] Permission denied



Et du coup, je sèche: le fichier /dev/uinput (si c'est bien lui qui est visé) est en rw pour root et rien pour les autres (et je ne vais pas aller faire du chown/chmod dans /dev…), et pas moyen de trouver un man qui expliquerait (c'est peut-être «seulement» que mon utilisateur n'est pas dans le bon groupe, mais bon, comment savoir de quel groupe il s'agit?).
À tout hasard, vu qu'il s'agit d'un soucis de permissions, j'ai tenté en root, pour voir: aucun message d'erreur, mais ça ne semble pas avoir le moindre semblant d'effet.
Édit immédiat: ah non, en fait, ça marche bien en root, modulo un time.sleep(1) entre la création de l'objet Device et le début de l'envoi des événements pour que X ait le temps de prendre ça en compte. C'est mentionné dans le fichier d'exemple fourni dans le paquet, mais j'avais oublié de le retranscrire dans mon script de test. Donc, c'est bien uniquement un soucis de permissions, de fait…

Si quelqu'un voit ce qui ne va pas et/ou a une piste pour faire tourner le bousin, n'hésitez pas smile Si vous voyez une autre manière de programmer des simulations d'événements claviers sans passer par X, proposez aussi, je prends ^^

(Note: et pendant ce temps-là, en Java, avec la classe java.awt.Robot, il est possible d'envoyer des événements qui semblent reçus y compris par Mednafen, sans avoir à jouer avec les modules. C'est rageant d'arriver à faire un truc en Java et pas en Python…)

Dernière modification par Elzen (24-07-2016 18:45:58)

Hors ligne

#2 23-11-2015 16:59:32

Elzen
Modérateur
Distrib. : Debian Sid GNU/Linux
Noyau : amd64 (à jour le vendredi)
(G)UI : Touhy
Inscription : 01-07-2014

Re : [Résolu] Simuler une entrée clavier

Grmblm.

J'ai finalement réussi à faire marcher python-uinput.
En fait, il faut un fichier dans /etc/udev/rules.d pour indiquer qui a le droit d'utiliser uinput (ce fichier est fourni par le module python sus-mentionné), et donc il m'a suffit de créer le groupe correspondant et d'y ajouter mon compte utilisateur. Désormais, uinput fonctionne chez moi.

Le soucis est en revanche que uinput ne semble pas avoir le moindre semblant d'effet sur Mednafen, lui non plus hmm

Donc retour à la case départ: je ne sais pas comment envoyer des événements claviers de manière compatible avec tout en Python.


Ça marche en Java, donc ça doit bien être possible, mais aller fouiller dans le code source d'OpenJDK risque fort d'être long et pénible, donc je suis ouvert à toute autre suggestion.

Hors ligne

#3 24-07-2016 18:39:47

Elzen
Modérateur
Distrib. : Debian Sid GNU/Linux
Noyau : amd64 (à jour le vendredi)
(G)UI : Touhy
Inscription : 01-07-2014

Re : [Résolu] Simuler une entrée clavier

Oh, au fait.

J'ai oublié de signaler que le truc est résolu depuis un moment.

En fait, utiliser la Xlib fonctionne dans tous les cas, à condition de laisser un délai plus important que je ne le faisais entre l'instruction d'appuyer sur une touche et l'instruction de la relâcher. Donc j'ai codé le truc uniquement avec la Xlib, et tout va bien.

Hors ligne

#4 25-07-2016 02:23:23

martinux_qc
Anar
Lieu : Montréal (Québec)
Distrib. : Debian 11 stable
Noyau : Linux 5.10.0-8-amd64
(G)UI : XFCE 4.16
Inscription : 12-10-2008

Re : [Résolu] Simuler une entrée clavier

Salut

Merci du retour final et d'avoir signalé que le problème était résolu ; comme on dit mieux vaut tard que jamais smile

"L'éducation vise à former des citoyens pas trop tatas et non pas à envoyer le plus de tatas possible à l'université."
Pierre Foglia (Journaliste à la retraite à La Presse)
Note : au Québec, le mot tata a un sens péjoratif qui sert à désigner une personne un peu idiote ou insignifiante. D'où les expressions familières : Espèce de grand, de gros tata! Être, avoir l'air tata.

Hors ligne

Pied de page des forums