Вывод на печать порожденного процесса приводит к плохо отформатированному выводу: почему? - PullRequest
0 голосов
/ 07 февраля 2020

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

Я хотел бы получить вывод первой программы (prog1.py) для отображения в реальном времени на терминале второй программы (prog2.py). Используя child.after, я получаю плохо отформатированный вывод: все \n и \r печатаются на выходе вместо того, чтобы правильно использоваться в качестве конца строки.

child = pexpect.spawn('python3 /home/robb/Workspace/prog1.py')

child.expect(".*do:")
child.sendline(sys.argv[1])
print(child.after)

Я получаю все выходные данные в одной строке :

b'Initializing database...\r\nDone initializing database!\r\n******************************\r\nProgram running\r\n******************************\r\n1. First Option\r\n2. Second Option\r\n\r\nPlease input number of action you want to do:'

Кроме того, ответ на вопрос (в данном случае sys.argv[1]) даже не появляется. Как правильно отобразить вывод prog1?

Использование print(child.before) Я получаю еще худший вывод, просто это:

b''

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Выход сохраняется в child.after как объект bytes. Чтобы получить вывод ASCII, декодируйте его соответственно:

print(child.after.decode('ascii'))
Initializing database...
Done initializing database!
******************************
Program running
******************************
1. First Option
2. Second Option

Please input number of action you want to do:

1 голос
/ 07 февраля 2020

child.after возвращает тип bytes вместо str, который вы ожидаете.

Преобразование вывода в str

print(child.after.decode('utf8'))
...