#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 дочернего процесса, и я не могу понять, почему.