5

我正在编写一个库来支持远程登录到远程服务器和运行应用程序。

在建立连接、取回数据、解析等方面,事情进展顺利(至少与通过文本界面与程序通信一样顺畅)。

如果输入正确,一个应用程序将更改光标,如果失败则保留原始光标(我不编写应用程序,我只需要使用它们。)

当所述应用程序正确启动时,这没有问题:

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 命令总是超时。

其中=“-1”

莫=无

response = "mumble mumble\r\r\n 其他东西\r\n\r\n你好# "

文档说可以将字符串或正则表达式对象传递给期望(我正在传递一个字符串),所以我错过了什么吗?查看 telnetlib 代码表明它调用的是 re.search(),而不是 re.match(),所以这似乎不是问题。

任何人都可以就我做错了什么提供建议吗?

编辑 在提示示例中添加了括号,以更好地说明为什么 expect() 没有按预期工作。

4

3 回答 3

5

不要忘记,如果您在 python 中使用正则表达式,您始终可以使用 raw ( r'my string') 方法,而不是添加所有转义;使其更具可读性。

于 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()。一切都没有运气。

多亏了 jathanism 的建议,我重新检查了使用正则表达式,这一次的想法expect()是,呃......在我想'字符串'的地方期待'正则表达式'。

果然,在我的提示字符串中有期望被视为正则表达式符号的字符——()确切地说是 。逃脱parens让它expect()完成它的工作。

于 2011-10-19T16:17:30.293 回答