Python pexpect отправляет содержимое буфера?
У меня есть следующий код в Python, использующий модуль pexpect для запуска сценария Perl, который задает ряд вопросов. Я использовал это в течение достаточно долгого времени и хорошо работает до сих пор.
pexpect python
index = child.expect(['Question 1:'])
os.system('sleep 2')
print 'Question 1:' + 'answer1'
child.sendline('answer1')
index = child.expect(['Question 2:'])
os.system('sleep 2')
print 'Question 1:' + 'answer2'
child.sendline('answer2')
index = child.expect(['Question 3:'])
os.system('sleep 2')
print 'Question 1:' + 'answer2'
child.sendline('answer2')
На данный момент у меня есть некоторый код, который проверяет, будет ли выводиться ошибка, когда вопрос 2 и вопрос 3 не совпадают. Я проверил журнал pexpect, и отправляемые операторы - именно то, что я хочу (количество байтов и строка).
Однако, когда я проверяю, что принимается кодом Perl, он получает следующее:
Вопрос 1: "ответ 1" <- ПРАВИЛЬНО
Вопрос 2: "ответ 1" <- НЕПРАВИЛЬНО
Вопрос 3: "ответ 2 ответ 2" <- почему-то его объединяют в одно
Есть идеи? Я не использую ничего особенного при порождении моего объекта pexpect: child=pexpect.spawn(cmd,timeout=140)
Редактировать: Добавлена функция кода Perl, которая запрашивает вопросы 2 и 3
sub getpw
sub getpw
{ my ($name, $var, $encoding) = @_;
my $pw = $$var;
PWD: while(1) {
system("/bin/stty -echo");
getvar($name, \$pw, 1);
print "\n";
system("/bin/stty echo");
return if $pw eq $$var && length($pw) == 80;
if (length($pw) > 32) {
print STDERR "ERROR: Password cannot exceed 32 characters, please reenter.\n";
next PWD;
}
return if $pw eq $$var;
my $pw2;
system("/bin/stty -echo");
getvar("Repeat password", \$pw2, 1);
print "\n";
system("/bin/stty echo");
print "#1: ";
print $pw;
print "\n";
print "#2: ";
print $pw2;
if ($pw2 ne $pw) {
print STDERR "ERROR: Passwords do not match, please reenter.\n";
next PWD;
}
last;
}
# Escape dangerous shell characters
$pw =~ s/([ ;\*\|`&\$!#\(\)\[\]\{\}:'"])/\\$1/g;
my $correctlength=80;
my $encoded=`$AVTAR --quiet --encodepass=$pw`;
chomp($encoded);
if($? == 0 && length($encoded) == $correctlength) {
$$var = $encoded;
} else {
print "Warning: Password could not be encoded.\n";
$$var = $pw;
}
}
sub getvar
sub getvar
{ my ($name, $var, $hide) = @_;
my $default = $$var;
while(1) {
if($default) {
$default = "*****" if $hide;
print "$name [$default]: ";
} else {
print "$name: ";
}
my $val = <STDIN>;
chomp $val;
### $val =~ s/ //g; # do not mess with the password
$$var = $val if $val;
last if $$var;
print "ERROR: You must enter a value\n";
}
}
1 ответ
Нет ничего плохого в вашем коде на стороне Python. Проверьте свою сторону perl кода. Для демонстрации я создал ниже на питоне скрипты вопросов и ответов, которые вызывают друг друга. Когда вы выполняете answers.py
он выдаст ожидаемый результат, как показано ниже. Также вам не нужно выполнять операторы сна child.expect будет блокировать до тех пор, пока не будет получен ожидаемый результат.
questions.py
answers = {}
for i in range(1, 4):
answers[i] = raw_input('Question %s:' % i)
print 'resuls:'
print answers
answers.py
import pexpect
child=pexpect.spawn('./questions.py', timeout=140)
for i in range(1, 4):
index = child.expect('Question %s:' % i)
child.sendline('answer%s' % i)
child.expect('resuls:')
print child.read()
выход
{1: 'answer1', 2: 'answer2', 3: 'answer3'}