5

リモートサーバーへのTelnet接続と実行中のアプリをサポートするライブラリを作成しています。

接続の確立、データの取得、解析などで物事は順調に進んでいます(少なくとも、テキストインターフェイスを介してプログラムと通信するために可能な限り順調に進んでいます)。

1つのアプリは、正しく入力された場合はカーソルを変更し、失敗した場合は元のカーソルを残します(アプリは作成せず、使用するだけです)。

上記のアプリが正しく起動すると、これは問題なく機能します。

promptB = "hello(x)# "   # Yes, the space at the end is intentional
response = tn_conn.cmd("app_name\n", prompt=promptB)

プロンプト変更(またはプロンプト変更の欠如)を使用して、プログラムが開始できなかったかどうかを検出したいと思います。これはtelnetlibのexpect()を試す絶好の機会だと思いました。expect()を使用すると、応答で一致する文字列のリストを渡すことができるからです。

ただし、これを機能させることはできません。

promptA = "hello(x)# "   # Yes, the space at the end is intentional
promptB = "hello> "      # Yes, the space at the end is intentional

tn_conn.write("app_name\n")
which_prompt, mo, response = self.tn_conn.expect([promptA, promptB], timeout=3)

アプリが正常に起動するかどうかに関係なく、expectコマンドは常にタイムアウトになります。

which = "-1"

mo=なし

response = "mumble mumble \ r \ r \ n other stuff \ r \ n \ r \ nhello#"

ドキュメントには、文字列または正規表現オブジェクトのいずれかを期待どおりに渡すことができると書かれているので(文字列を渡す)、何かが足りませんか?telnetlibコードを見ると、re.match()ではなくre.search()が呼び出されていることがわかります。したがって、これは問題ではないようです。

誰かが私が間違っていることについて提案を提供できますか?

編集 プロンプトの例に追加されたparensを使用して、expect()が期待どおりに機能しなかった理由をわかりやすく説明します。

4

3 に答える 3

5

r'my string'Pythonで正規表現を使用している場合は、すべてのエスケープを追加するのではなく、いつでもraw()メソッドを使用できることを忘れないでください。読みやすくなります。

于 2013-12-23T18:00:55.667 に答える
4

私は何かがうまくいくようになりました。#または%または$プロンプトを探します。プロンプトについては、特殊文字がエスケープされていることを確認してください。()。たぶん、念のためにすべてを逃れる。

idx, obj, response = tn_conn.expect("\#","\%","\$",3)
于 2013-02-13T15:38:17.597 に答える
3

以前の試みで.*は、検索文字列の両端に配置することによって正規表現オプションを追求re.compile()し、検索文字列を渡す前に検索文字列に対してaを実行していました.expect()。すべて運がない。

ジャサニズムの提案のおかげで、私は正規表現を使用して再検討しました。今回expect()は、「文字列」を考えていた「正規表現」を期待していたのです。

案の定、プロンプト文字列には、()正確には正規表現記号として扱われることを期待する文字が含まれていました。親を逃れることexpect()はその仕事をさせます。

于 2011-10-19T16:17:30.293 に答える