Pexpect не обрабатывает вывод из скрипта python, если вывод короткий, но работает для более длинного вывода - PullRequest
1 голос
/ 17 апреля 2020

Итак, я пытаюсь использовать pexpect для вывода некоторых результатов и получаю странные результаты.

Для тестирования у меня есть этот скрипт, который просто печатает некоторые вещи, на которые я должен рассчитывать:

#!/usr/bin/env python3

for _ in range(4):
    print('test')
print('<<<canary>>>')
for _ in range(4):
    print('other stuff')
print('<<<end>>>')

Затем я пытаюсь ожидать этого в сеансе i python. Однако, похоже, он его вообще не видит:

In [1]: import pexpect                                                                                                                                                                                                                                                  

In [2]: s = pexpect.spawn('./spawn_test.py', logfile=open('outfile.log', 'wb'))                                                                                                                                                                                         

In [3]: s.expect('<<<canary>>>')                                                                                                                                                                                                                                        
---------------------------------------------------------------------------
EOF                                       Traceback (most recent call last)
EOF: End Of File (EOF). Empty string style platform.

In [4]: s.before                                                                                                                                                                                                                                                        
Out[4]: b''

In [5]: s.buffer                                                                                                                                                                                                                                                        
Out[5]: b''

Нет вывода вообще. Однако, если я просто увеличу диапазон в исходном скрипте (скажем, до 40000 вместо 4), то он будет работать нормально:

#!/usr/bin/env python3

for _ in range(40000):
    print('test')
print('<<<canary>>>')
for _ in range(40000):
    print('other stuff')
print('<<<end>>>')

затем

In [1]: import pexpect                                                                                                                                                                                                                                                  

In [2]: s = pexpect.spawn('./spawn_test.py', logfile=open('outfile.log', 'wb'))                                                                                                                                                                                         

In [3]: s.expect('<<<canary>>>')                                                                                                                                                                                                                                        
Out[3]: 0 (0x0)

In [4]: s.expect('<<<end>>>')                                                                                                                                                                                                                                           
Out[4]: 0 (0x0)

Странная вещь в том, что хотя он работает во втором случае (что доказывает, что в целом метод работает), в первом случае вывод сценария вообще отсутствует - я полностью вошел в функцию до os.read ( self.fileno), и ничего не вернулось. Что не имеет никакого смысла, поэтому я чувствую, что что-то упустил. Кроме того, s.terminated изменяется с False на True после ожидаемого значения, которое выбрасывает EOF; read() и readline() также не возвращают вывод в первом случае, но работают нормально во втором случае.

Это на OSX, python 3.7.

1 Ответ

1 голос
/ 22 апреля 2020

Оказывается, это известная проблема с pexpect. Похоже, решение состоит в том, чтобы заключить команду в оболочку, например

s = pexpect.spawn('bash -c spawn_test.py')

Не идеально, но это исправило вышеуказанный случай.

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

...