2009-03-10 8 views
2

Ich verbinde mich über Telnet mit einem Hardwaregerät. Dieses Gerät ist ziemlich einfach in Bezug auf E/A. Also gebe ich einen Befehl dazu, und danach pumpt das Gerät Daten von Zeile zu Zeile, einmal pro Sekunde. Jede Zeile enthält nur eine Nummer.Wie kann ich mit Pythons Telnetlib Daten von einem Gerät für einen bestimmten Zeitraum abrufen?

Also meine Frage ist das: Wenn ich mit diesem Gerät verbinden mit Python Telnetlib, wie kann ich Daten für einen festen Zeitraum (oder eine feste Anzahl von Datenzeilen) holen?

Ich habe versucht, alle verschiedenen read_ Befehle zu verwenden, aber sie scheinen alle zu blockieren, abgesehen von read_until, die ich nicht verwenden kann, da die Ausgabe nicht verwendet werden kann, um zu bestimmen, wann ich aufhören soll.

(Ich laufe Python 2.5 unter Cygwin, BTW).

Edit: Vielleicht ist die eigentliche Frage, ob ich Telnetlib überhaupt verwenden soll, oder soll ich einfach das Socket-Modul benutzen?

Antwort

5

Aus Ihrer Beschreibung bin ich nicht klar, ob Sie telnetlib verwenden, weil das Gerät, das Sie sind Verbindungsklemmen-Setup per Telnet vorgesehen erfordert oder weil es wie das Richtige schien zu tun.

Wenn das Gerät ist so einfach wie Sie beschreiben - d. Terminal-Optionen bei der Verbindung nicht verhandeln - haben Sie das asynchat Modul in Betracht gezogen? Es wäre angemessen für die Art von E/A-Mustern, die Sie beschreiben, "Befehl senden, Zeilen lesen".

Alternativ können Sie für eine untergeordnete Ebene das Modul socket verwenden, um die Verbindung zu dem Gerät zu öffnen, und dann in einer zeitgesteuerten Schleife sitzen und die eingehenden Daten in die Zeitzone read() eingeben. Wenn die Zeilen newline-terminiert sind, sollte es für Sie einfach sein, jede einzelne Nummer zu identifizieren. Wenn Sie mit dem Blockieren beschäftigt sind, kleben Sie diese Schleife in einen eigenen Thread.

+1

Spot auf. Mein Fehler war, dass ich zuerst Telnet verwenden musste! – Ben

1

Lesen Sie Zeilen in einer Schleife, bis Sie entweder die erforderliche Anzahl von Zeilen gelesen haben oder das Zeitlimit erreicht ist. Es klingt jedoch nicht so, als ob Sie tatsächlich eine Telnet-Bibliothek benötigen. Warum nicht einfach einen einfachen TCP für die Verbindung verwenden?

2

Meiner Erfahrung nach die meisten dieser Geräte eine Eingabeaufforderung verwenden, wobei in diesem Fall Telnet.read_until() geeignet ist:

Telnet.read_until(expected[, timeout])

lesen bis zu einem bestimmten Zeichenfolge, erwartet, angetroffen wird oder bis Timeout Sekunden vergangen sind. Wenn keine Übereinstimmung gefunden wird, geben Sie stattdessen die verfügbare Zeichenfolge zurück, möglicherweise die leere Zeichenfolge. Raise EOFError, wenn die Verbindung geschlossen ist und keine gekochten Daten verfügbar sind.

Wenn keine brauchbare (sich wiederholende) prompt von dem Gerät präsentiert wird, versuchen Telnet.read_very_eager() oder Telnet.read_very_lazy():

Telnet.read_very_eager()

alles lesen, die ohne Blockierung in I/O (eifrig) sein kann, .

Raise EOFError wenn Verbindung geschlossen und keine gekochten Daten verfügbar sind. Rückgabe '' wenn keine anderen Daten verfügbar sind. Blockieren Sie nicht, außer in der Mitte einer IAC-Sequenz.

2

Es klingt wie Blockieren ist nicht wirklich Ihr Problem, da Sie wissen, dass Sie nur für eine Sekunde blockieren werden. Warum nicht etwas wie:

lines_to_read = 10 
for i in range(lines_to_read): 
    line = tel.read_until("\n") 
Verwandte Themen