2009-03-10 3 views
2

私は、テルネット経由でハードウェアデバイスに接続しています。そのデバイスはI/Oの点でかなりシンプルです。だから、私はそれにコマンドを提出し、その後、デバイスは1秒に1回、データを1行ずつ取り出す。各行には数字だけが含まれています。pythonのtelnetlibを使用して、一定期間デバイスからデータを取得できますか?

私はこのデバイスにpythonのtelnetlibを使って接続すると、一定期間(または一定数のデータ行)データを取得できますか?

さまざまなread_コマンドをすべて使用しようとしましたが、出力を使用することができないため、使用することはできません。

(私はPython 2.5をCygwinで実行しています、btw)

編集:実際の質問は、私がtelnetlibを使っていなければならないのでしょうか、それともソケットモジュールを使うべきでしょうか?

答えて

5

あなたがtelnetlibを使用している場合は、に接続しているデバイスがTelnetによって、またはそれを行うには正しいことのように思えたので、提供される端末の設定が必要ですので、私は明確ではありませんよ。

デバイスがあなたの説明どおりに簡単な場合、接続時に端末オプションをネゴシエートしない - asynchatモジュールを検討しましたか?あなたが記述しているIOパターンの「sendコマンド、read lines」ソートには適しています。

また、低レベルの場合は、socketモジュールを使用してデバイスとの接続を開き、タイミングループに入り、受信データをread()に入れることができます。行が改行で終わっている場合は、個々の番号を簡単に識別できるようにする必要があります。ブロッキングに懸念がある場合は、このループを独自のスレッドに張ってください。

+1

スポットがあります。私の間違いは、私が最初にtelnetを使う必要があると思っていたことでした! – Ben

1

必要な行数を読み込むか制限時間に達するまで、行をループで読み込みます。しかし、実際にtelnetライブラリが必要なようには聞こえません。接続に単純なTCP socketを使用するだけではどうですか?私の経験で

2

、ほとんどのこのようなデバイスは、Telnet.read_until()が適切である場合には、いくつかのプロンプトを使用します。

Telnet.read_until(expected[, timeout])

読む期待与えられた文字列が、遭遇するまで、またはタイムアウト秒が経過するまで。 一致するものが見つからない場合は、代わりに使用可能なものを返します。空の文字列も返します。接続が閉じていて、調理済みのデータがない場合は、EOFErrorを発生させます。

一切使用可能(繰り返し)プロンプトがデバイスによって提示されていない場合は、Telnet.read_very_eager()、またはTelnet.read_very_lazy()を試してみてください。

Telnet.read_very_eager()

読むI/Oでブロックせずにできるすべて(熱心) 。

接続を閉じ、使用可能な調理データがない場合はEOFErrorを発生させます。そうでない場合に利用可能な調理済みデータがない場合は「」を返します。 IACシーケンスの最中でなければブロックしないでください。あなたの説明から

2

ブロッキングは本当に問題ではないように思えます.1秒間しかブロックしないことがわかっているからです。なぜなら何かのようにしてください:

lines_to_read = 10 
for i in range(lines_to_read): 
    line = tel.read_until("\n") 
関連する問題