リモートサーバーへの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()が期待どおりに機能しなかった理由をわかりやすく説明します。