对不起,如果这是一个愚蠢的问题,这是我第一次尝试python。我写了一个脚本,从文件中读取接口列表,登录到cisco 7600,然后调用一个拉动接口状态和running-config的函数。我在每个接口上运行2个命令。问题是管理pexpect输出。一些接口它完全符合我的预期(没有双关语)和其他接口,它似乎根本不等待任何输出,还有一些接口来自一个命令的输出最终会出现2或3个其他接口之后检查。现在我只需输出所有输出到sys.stdout。一旦我开始工作,我会把它写到文件中。我尝试使用sendline而不是send,我玩过child.timeout,child.maxsize,time.sleep ......我可以根据请求发布输出。我只是想避免这么长时间。我遇到问题的代码是:
def get_int_conf(child, if_file, dev_type, prompt):
open_file = "/home/" + if_file
if dev_type == 'cisco':
child.logfile = sys.stdout
with open(open_file, 'r') as int_list:
#
#Pull name from list
#
for int_name in int_list:
print "Interface name is %s" % (int_name)
#
#Build correct syntax
#
match1 = re.search("(Gi|Te)", int_name)
match2 = re.search("[0-9]+/[0-9]+", int_name)
if match1 and match2:
first_match = match1.group(1)
second_match = match2.group()
short_nm = first_match + second_match + " \n"
#
# Run show interface status commmand
#
child.send('sh interface status | in ' + short_nm)
child.expect(prompt)
child.send('\n')
#
# Run show run interface command
#
child.send('sh run interface ' + int_name)
child.expect(prompt)
child.send('\n')
return()
答案 0 :(得分:0)
由于child
是在函数外部创建和使用的,所以我首先确保它首先进入“已知状态”,然后只是替换sendline和expect语句。沿着这些线路的东西曾经在7600上为我工作:
child.sendline('term len 0') # if not already done, else just child.sendline('')
child.expect(prompt)
...
for int_name in int_list:
...
child.sendline('sh interface status | in ' + short_nm)
child.expect(prompt)
child.sendline('sh run interface ' + int_name)
child.expect(prompt)
也许很愚蠢,但我也会检查open_file
中接口的顺序。
附注:您可以访问包含pexpect在每个child.expect()
语句中匹配模式之前和之后接收的内容的字符串缓冲区,其中包含以下可以随意打印/处理的结构:
print child.before
print child.after
您可能希望熟悉它们 - 它们在开发/调试期间是您的朋友,也许您甚至可以在实际的脚本实现中使用它们。