2011-02-28 5 views
6

Je suis conscient que raw_input ne peut pas être utilisé en torsadé. Cependant, voici mon application souhaitée.Comment puis-je utiliser un raw_input avec twisted?

J'ai un matériel qui fournit un port série terminal interactif. J'essaie de me connecter à ce port et d'envoyer des commandes de manière asynchrone. Je l'ai besoin de cette façon parce que c'est un contrôleur de moteur qu'une fois que j'émets une commande, il va "bloquer" et s'enfuir (mon code actuel). Je dois pouvoir entrer une autre commande telle que ESTOP en cas de problèmes ou de danger.

J'ai lu quelque chose au sujet de twisted.internet.stdio.StandardIO mais je n'ai pas eu beaucoup de chance .. Tout conseil/aide sur ce serait génial.

Répondre

7

Vous avez ici quelques options que vous pouvez utiliser. L'un serait d'utiliser un processus fils pour gérer la communication avec le port série et un canal pour communiquer entre le parent et l'enfant (ce qui est simplifié par le protocole de processus de Twisted). Une autre consiste à séparer un thread Python séparé et à utiliser raw_input à partir de là. Les mécanismes de communication inter-thread normaux fonctionnent bien avec Twisted. La seule vraie torsion vient de la façon dont vous réveillez le réacteur tordu du fil séparé. Le mécanisme principal pris en charge pour cela utilise reactor.callFromThread(). L'utilisation de fils dans Twisted nécessite une réflexion approfondie et est facile à bousiller (ce qui explique pourquoi il est généralement déconseillé), mais parfois c'est le bon outil pour le travail.

3

Avez-vous vu les exemples StandardIO? Il y a un couple dans le Twisted core examples, stdin.py et stdiodemo.py. Il y a a more advanced example qui implique l'édition de ligne et l'historique dans Twisted Conch. Vous pouvez exécuter celui-ci avec python -m twisted.conch.stdio pour le voir en action. L'exemple de Conch ne fonctionne probablement que sur les plateformes POSIX, pas sur Windows.

+0

Les exemples stdin.py et stdiodemo.py sont très rudimentaires. Par exemple, ils ne montrent pas comment faire l'édition de ligne, l'historique, la complétion d'un onglet ou d'autres fonctions auxquelles on est habitué depuis les interfaces readline. L'exemple avancé montre simplement ConsoleManhole. Que faire si je veux entrer des commandes personnalisées qui ne sont pas du code python? Et que fait TerminalProcessProtocol dans le code? Il ne semble pas être référencé nulle part. – blubberdiblub

+0

C'est vrai. Peut-être que vous voulez poser une question de votre choix ... –

+0

Oui, je pourrais éventuellement. Mais d'abord je vais essayer de me battre avec twisted et readline moi-même (ce qui explique pourquoi je cherchais des tutoriels appropriés) et si cela ne porte aucun fruit, je peux probablement former une question sur où je suis resté coincé. – blubberdiblub

Questions connexes