Je me connecte à un périphérique matériel via telnet. Cet appareil est assez simple en termes d'E/S. Je lui envoie donc une commande, et après cela, l'appareil pompe les données une ligne à la fois, une fois par seconde. Chaque ligne contient juste un nombre. Donc, ma question est la suivante: si je me connecte à cet appareil en utilisant telnetlib de python, comment puis-je récupérer des données pour une période de temps fixe (ou un nombre fixe de lignes de données)? J'ai essayé d'utiliser toutes les différentes commandes read_, mais elles semblent toutes bloquer indéfiniment, à l'exception de read_until, que je ne peux pas utiliser car la sortie ne peut pas être utilisée pour déterminer quand arrêter. (Je cours python 2.5 sous Cygwin, BTW). Edit: La vraie question est peut-être, devrais-je utiliser telnetlib à tout cela pour cela, ou devrais-je simplement utiliser le module de socket?Comment puis-je utiliser telnetlib de python pour extraire des données d'un appareil pendant une période donnée?
Répondre
D'après votre description, je ne suis pas clair si vous utilisez telnetlib parce que l'appareil que vous vous connectez à nécessite une configuration de terminal fourni par telnet ou parce qu'il semblait être la bonne chose à faire.
Si le périphérique est aussi simple que vous l'avez décrit, par exemple. ne pas négocier les options de terminal sur la connexion - avez-vous considéré le module asynchat? Cela serait approprié pour le type d'E/S "envoyer une commande, lire des lignes" que vous décrivez.
Alternativement, pour quelque chose de plus bas niveau, vous pouvez utiliser le module socket pour ouvrir la connexion au périphérique, puis s'asseoir dans une boucle temporisée et read()
les données entrantes. Si les lignes sont terminées par un saut de ligne, il devrait être simple pour vous d'identifier chaque numéro individuel. Si vous êtes concerné par le blocage, collez cette boucle dans son propre fil.
Lire les lignes dans une boucle jusqu'à ce que vous ayez lu le nombre de lignes requis ou que la limite de temps soit atteinte. Cependant, il ne semble pas que vous ayez réellement besoin d'une bibliothèque Telnet. Pourquoi ne pas simplement utiliser un simple TCP socket pour la connexion?
Dans mon expérience, la plupart de ces appareils utilisent une invite, dans ce cas Telnet.read_until()
est approprié:
Telnet.read_until(expected[, timeout])
Lire jusqu'à une chaîne donnée, attendue, est rencontrée ou jusqu'à ce que timeout secondes se sont écoulées. Si aucune correspondance n'est trouvée, renvoyer tout ce qui est disponible à la place, éventuellement la chaîne vide. Augmentez EOFError si la connexion est fermée et qu'aucune donnée n'est disponible.
Si aucun utilisable (répétitif) rapide est présenté par le dispositif, essayez Telnet.read_very_eager()
ou Telnet.read_very_lazy()
:
Telnet.read_very_eager()
Lire tout ce qui peut être sans bloquer dans I/O (impatient) .
Relancez EOFError si la connexion est fermée et qu'aucune donnée n'est disponible. Renvoie '' si aucune donnée cuite n'est disponible autrement. Ne bloquez pas sauf si vous êtes au milieu d'une séquence IAC.
Il semble que le blocage n'est pas vraiment votre problème, puisque vous savez que vous ne serez le blocage pour une seconde. Pourquoi ne pas faire quelque chose comme:
lines_to_read = 10
for i in range(lines_to_read):
line = tel.read_until("\n")
- 1. Calcul des blocs de temps à partir d'une période donnée
- 2. Clé primaire lorsque vous stockez beaucoup de données pendant une courte période de temps
- 3. Comment initialiser une période avec des secondes
- 4. MySQL: Récupération du nombre d'enregistrements à partir d'une période donnée
- 5. Vérifiez si une application est inactif pendant une période de temps et le verrouiller
- 6. Comment extraire des données d'un fichier XML
- 7. Comment extraire des données d'un DataTable?
- 8. DB2 - Classement des données par période
- 9. comment extraire des données de la base de données?
- 10. Comment extraire des données d'un PDF?
- 11. une doublure pour extraire le bloc de données par bloc
- 12. Module Python pour extraire les dates probables des chaînes?
- 13. Comment déterminer le type de base de données pour une connexion JDBC donnée?
- 14. Dans TFS, puis-je obtenir une liste de tous les fichiers touchés par un utilisateur pour une période donnée?
- 15. Meilleure méthode pour extraire des données de SharePoint afin de les utiliser avec une application de Business Intelligence
- 16. Comment utiliser WebRequest pour publier des données et obtenir une réponse à partir d'une page Web
- 17. Comment utiliser regex pour extraire des groupes de données de questions-réponses à partir de fichiers html?
- 18. Une base de données pour python 3?
- 19. Utiliser DataBinder.Eval avec un indexeur contenant une période
- 20. Comment «spec» un serveur Web pour soutenir une application donnée?
- 21. Extraire des données avec regex de html
- 22. Comment générer des données de test pour mon script Python?
- 23. Comment savoir quel type de données utiliser en Python?
- 24. Comment extraire une seule colonne de données d'un DataSet rempli?
- 25. Temporisateur portable pour une période d'environ 100ms
- 26. Comment détecter une connexion ActiveSync sur un appareil mobile?
- 27. Comment puis-je travailler sur la hiérarchie des classes donnée une instance d'objet en Python?
- 28. Combien de lignes de code ont été modifiées au cours d'une période donnée?
- 29. Comment utiliser jQuery (ou similaire) pour extraire tous les CSS
- 30. Comment transférer des données binaires avec Python?
Spot sur. Mon erreur a été de penser que je devais utiliser Telnet en premier lieu! – Ben