2015-06-23 2 views
0

Извините, если это глупый quesiton, это моя первая попытка на python. Я написал сценарий, который считывает список интерфейсов из файла, записывается в cisco 7600, а затем вызывает функцию, которая вытягивает статус и run-config интерфейсов. Я запускаю 2 команды на каждом интерфейсе. Проблема заключается в управлении выводом pexpect. Некоторые интерфейсы делают именно то, что я ожидаю (не каламбур) и другие, он, похоже, не ждет какого-либо вывода, остальные же вывод из одной команды заканчивается после того, как два или три других интерфейса были проверено. Прямо сейчас у меня есть все, что выводится на sys.stdout. Как только я получу его работу, я напишу его в файл. Я пробовал использовать sendline вместо send, я играл с child.timeout, child.maxsize, time.sleep ... Я могу отправлять выходные данные по запросу. Я просто стараюсь, чтобы это не слишком долго. Код, который я имею проблемы с является:pexpect output не работает

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

С child создается и используется за пределами функции Я бы сначала убедиться, что первым попадает в «известное состояние», а затем просто альтернативный sendline и ожидают заявления. Что-то вдоль этих линий, используемых для работы для меня на 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 

Вы могли бы хотите познакомиться с ними - они ваши друзья во время разработки/отладки, возможно, вы даже можете использовать их в реальной реализации скрипта.

Смежные вопросы