Взаимодействие Python с Fortran через командную строку с использованием Pexpect - PullRequest
1 голос
/ 28 июля 2011

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

open: Permission denied apparent state: unit 4 named subsat.out.55 last format: list io lately writing sequential formatted external IO 55

, когда я пытаюсь:

p = pexpect.spawn(myFortranProgram,[],5)
p.logfile_read = sys.stdout
p.expect("(.*)")
p.sendline("55")

Насколько я понимаю, я, скорее всего, отправляю 55 на неправильный блок ввода.Как правильно отправить ввод в программу FORTRAN, используя pexpect в Python?

Спасибо.


Редактировать: Когда параметр p.sendline пуст (например ,psepsendline()) или содержит только пробелы, программа работает как положено.Нужно ли как-то указывать формат ввода при отправке непространственных значений в программу на языке FORTRAN?

1 Ответ

1 голос
/ 29 июля 2011

Модуль 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» (без кавычек в обоих случаях).

...