Recevoir des données d'un autre programme

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je travaille actuellement sur un programme avec PyQt et j'ai besoin entre autres de me repérer sur une carte d'un verger. Plusieurs solutions : à partir de coordonnées GPS, d'une distance depuis une origine, des troncs des pommiers…

Je souhaiterais donc pouvoir laisser le choix à l'utilisateur quant à son mode d'acquisition. Je pourrais programmer toutes les méthodes et lui demander de sélectionner celle souhaitée, mais il en restera toujours et c'est moins flexible.

Du coup, comment pourrais-je récupérer la position depuis un programme externe ? S'agit-il du bon comportement ?

Merci !

+0 -0
Staff

Je n'ai pas vraiment compris ton problème en l'occurence. TU pourrais détailler ? Ce qui ne te plais pas actuellement dans ton app, ce vers quoi tu veux aller, etc.

+0 -0
Auteur du sujet

Admettons que l'objectif de mon app est d'afficher notre position sur une ligne droite - en l'occurrence, un rang de verger. Il y a plusieurs possibilités : coordonnées GPS, numéro du tronc devant lequel on est, d=v*t…

Du coup, je souhaiterais offrir le choix à l'utilisateur. S'il a un GPS très précis, autant l'utiliser. S'il a un système de détection des troncs, de même. Etc. En fait, je souhaite en quelque sorte permettre à l'utilisateur d'écrire sa propre fonction Python qui donnerait à mon programme la position du tracteur.

Par exemple, prenons un programme extrêmement basique dont l'objectif serait d'afficher la vitesse du tracteur - juste l'afficher. Or il existe plusieurs méthodes pour l'acquérir : GPS, radar, lecture du compteur du tableau de bord, encodeur sur une roue, manuellement… Donc je souhaite que l'utilisateur puisse fournir un programme à partir duquel, en appelant une fonction, j'obtiendrais la vitesse et pourrait la passer en argument à mon programme - donc en fait, l'afficher -, indépendamment de la manière de l'acquérir. Seulement, ma dernière phrase peut prêter à confusion : je ne peux pas faire un simple "python affichage.py valeur_du_programme_utilisateur" puisque mon programme à moi est une app PyQt à part entière.

À force d'en parler, ça devient plus clair pour moi aussi. Je pourrais demander à l'utilisateur de charger un fichier Python donc la fonction main renverrait la valeur de la vitesse.

Mais est-ce une pratique correcte ?

Merci !

+0 -0

Salut,

Je ne connais pas spécialement python, mais tu as deux approches très générales :

  • Soit on peut configurer ton programme pour qu'il demande la position depuis une source externe à intervalle réguliers. Ca va passer soit par un plugin, soit par un service que ton programme appellera. En gros, du polling du point de vue de ton programme.
  • Sinon tu as l'approche inverse, demander à l'utilisateur de communiquer la position à ton programme. L'approche classique pour permettre à l'utilisateur de faire ça pas trop difficilement c'est par stdin/stout à la CGI-like, par socket, ou par service web. Du point de vue de ton programme c'est du push.

L'un comme l'autre ont des avantages et des inconvénients, et seront plus ou moins faciles suivant ce que l'autre partie peut ou veut faire. Le matériel peutil envoyer ses données GPS automatiquement quelque part ? Si oui, c'est probablement plus malin de te conformer au protocole de ta machine et faire du push. Peut-on se connecter sur ton matériel via une API ? Dans ce cas le pull sera peut-être plus simple… à toi de voir ce qui t'arrange le mieux.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Auteur du sujet

Je pense que je vais opter pour la première solution vu que le programme a besoin de connaître la position à intervalles réguliers.

Par contre, je ne vois pas trop comment interfacer ça. Dans ce cas précis, j'aurai mon programme sur une RPi. Je pourrais demander à l'utilisateur de mettre le sien dessus également, d'en préciser le chemin à mon programme et de définir une fonction main() que j'appellerais quand je le voudrais. Ça fonctionne si je peux considérer son programme comme un script que l'on exécute au besoin. Mais si il faut qu'il tourne en permanence, pour chronométrer par exemple ? Je peux employer des sockets ?

Merci. =)

+0 -0

Personnellement, je serais passé par un système type Remote objects (tu as le packqge Pyro, de mémoire) pour communiquer avec un programme externe. Ça offre les gros avantages de standardiser les échanges et de pouvoir déporter l'autre programme sur une autre machine.

Les sockets, c'est utile mais mieux vaut s'en passer pour travailler à plus haut niveau.

Shave the whales! | Thistle

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte