Python: Popen (). Stdout.peek () зависает - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь интегрировать подобную REPL программу командной строки в проект Python. Программа командной строки принимает входную строку и возвращает выходную строку, и она прекрасно работает при запуске самостоятельно. Проблема в том, что когда я пытаюсь использовать Popen().stdout.peek() или .read() на нем, он зависает и не производит вывод.

>>> p = Popen('Test.exe', stdin=PIPE, stdout=PIPE, stderr=PIPE)
>>> p.stdin.write(bytes('message\n', 'utf-8'))
8
>>> p.stdin.flush()
>>> p.stdout.peek()  # Hangs

Интересно, что это работает, если программа командной строки написана и на Python, но при использовании той, которую я действительно хочу использовать, она зависает. Обе программы ведут себя ожидаемым образом при запуске вручную в командной строке. Я также не могу использовать p.communicate('message'), потому что процесс находится в состоянии и мне нужно выполнить несколько команд.

1 Ответ

0 голосов
/ 11 сентября 2018

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

Возможно, вы захотите попробовать отладку как таковую, закройте стандартный ввод и посмотрите, работает ли он:

p.stdin.close()
p.stdout.read()

Если это сработает, посмотрите, что подпроцесс ожидает как END команды. Например. возможно, он ожидает \r\n от \n. Не зная, как работает основной процесс, трудно сказать, что здесь происходит не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...