Почему pexpect дублирует команды в Python 3

Я использую pexpect для отправки этой команды:

fmsadmin list files -s

С помощью этой интерактивной программы

[('username \\(.+\\):', 'userName\n'), ('password:', 'invalidPW\n'),
('username \\(.+\\):', 'userName\n'), ('password:', 'validPW\n')]

Как это:

run( cmd, events=program, timeout=20)

Что заканчивается 4 парами имени пользователя и пароля вместо 2:

username (userName): userName
password:
fmsadmin: Permission denied, please try again.
username (userName): userName
password:
fmsadmin: Permission denied, please try again.
username (userName): userName
password:
fmsadmin: Permission denied, please try again.
username (userName): userName
password:
fmsadmin: Permission denied.
Error: 9 (Access denied)

Что-то не так со структурой интерактивной программы? Может быть, есть другой таймер, чтобы дождаться появления фраз? Почему я получаю 4 пары, когда я программирую только 2 пары. Кстати, для меня каждая из этих небольших программ для имени пользователя и для пароля является отдельными функциями. Когда я делаю версию этой функциональности для 1 пары, она работает. ИОВ:

Это работает:

[('username \\(.+\\):', 'userName\n'), ('password:', 'validPW\n')]

Для интерактивной программы прямо выше я делаю:

[iUserName(), iPassword()]

Интерактивная программа вверху создается следующим образом:

[iUserName(), invPassword(), iUserName(), iPassword()]

Я включаю их только для того, чтобы показать, что согласованные программы генерируются кодом. Я считаю, что выходные примеры - это то, на что мы должны смотреть.


person Keith    schedule 03.06.2020    source источник


Ответы (1)


pexpect.run(events=[(pat1, reply1), (pat2, reply2)]), сначала не сопоставляется с шаблоном 1 и не отправляет ответ 1, а затем ждет сопоставления с шаблоном 2 и не отправляет ответ 2. Вместо этого он все время пытается сопоставить любой из шаблонов, хотя и проверяет их в заданном порядке.

Таким образом, никогда нет смысла повторять один и тот же шаблон, поскольку первое появление шаблона всегда будет единственным совпадением, если вообще будет соответствовать.

Если вы хотите сделать последовательность похожих совпадений, вам придется прибегнуть к обычному механизму spawn(), expect(), send(), expect(), send(),....

person meuh    schedule 04.06.2020
comment
Ну это печально. У меня была эта работа с командой ожидания unix, которая следует порядку создания «программы». Я тестирую программное обеспечение, иначе я бы даже не хотел этого делать. Одна действующая учетная запись и пароль подходят для реальной работы. Использование expect(), send() очень неуклюже. Хм, я полагаю, я мог бы создать цикл и вытащить один элемент из моего списка за раз и отправить его на выполнение. Это должно имитировать то же самое. Интересно, на кого я могу получить SCR. - person Keith; 04.06.2020
comment
дох... конечно, это не сработает. Вы вводите команду одновременно с программой. Угг... это должен быть SCR или метод expect(), send(). Мне не нравится писать отдельные фрагменты кода для каждого уникального теста, который я пишу. Обычно я создаю массив и отправляю его в очень минимальный класс бегуна, который я написал. Угг больше думал. - person Keith; 04.06.2020