Модуль pexpect - это то, чего я раньше не использовал, но он мог бы пригодиться мне, поэтому я попробовал это.
Edit:
Мне не удалось воспроизвести ошибку, о которой вы сообщаете. Глядя на эту ошибку, я думаю, что она связана с чтением из файла, что может быть результатом других проблем. Из того, что я видел, это не то, что pexpect предназначен для непосредственной обработки; однако вы можете заставить его работать с конвейером, как в примере из моего первоначального ответа ниже.
У меня нет проблем с отправкой данных в поток ввода-вывода Fortran 5 (стандартный). Я создал программу на фортране под названием regurgitate, которая выдает приглашение «Ваша запись?», Затем получает строку ввода от пользователя в потоке ввода-вывода 5, а затем выводит ее обратно. Следующий код работает с этой программой:
import pexpect
child = pexpect.spawn('./regurgitate')
child.setecho(False)
ndx = child.expect('.*Your entry?.*')
child.sendline('42')
child.expect([pexpect.EOF])
print child.before
child.close()
Выход просто:
42
Именно то, что я ожидал. Однако, если моя программа на Фортране говорит что-то другое (например, «Ваш ввод?»), Pexpect просто зависает или время ожидания истекает.
Оригинальное предложение:
Может быть, этот пример pexpect.run () поможет вам. По крайней мере, кажется, что он запускает мою программу регургитации (простая программа на Фортране, которая принимает входные данные, а затем распечатывает их):
import pexpect
out = pexpect.run('/bin/bash -c "/bin/cat forty-two | ./regurgitate"')
print out
Вывод был:
Ваша запись?
42
Где регургитат распечатывает "Вашу запись?" приглашение и сорок второй файл содержит «42» (без кавычек в обоих случаях).