popen_spawn ожидайте перед бесконечным циклом

#python-3.x #windows #loops #pexpect

Вопрос:

К сожалению, мне было поручено написать модульные тесты для python, работающие в Windows. У меня нет доступа к контейнерам, и я должен иметь дело с взаимодействием с самой Windows. Я запускаю Python 3.9

Я использую pexpect.popen_spawn для создания дочернего скрипта python, для которого я пишу тесты, и использую метод expect для чтения stdout ребенка.

Я заставляю это работать должным образом, когда тестирую сценарий, который обычно запускается и завершается следующим образом

 child = popen_spawn.PopenSpawn(['python.exe','test.py'],encoding='utf-8')
child.logfile = sys.stdout

child.expect('foo')
child.expect(pexpect.EOF)
 

test.py здесь есть только одна строка

 print('foo')
 

Однако, когда test.py содержит бесконечный цикл, как и сценарий, который я планирую протестировать, ожидание от ребенка не совпадает в 30-секундном окне по умолчанию. Новое и проблематичное test.py заключается в следующем:

 import time

print('foo')
while(True):
    time.sleep(1)
 

И изменения в тестовом сценарии заключаются в следующем:

 child = popen_spawn.PopenSpawn(['python.exe','test.py'],encoding='utf-8')
child.logfile = sys.stdout

child.expect('foo')
child.kill(signal.CTRL_C_EVENT)
 

Каким-то образом зацикливание не позволяет popen_spawn прочитать stdout дочернего процесса, и я не могу понять, почему.