1

我正在使用 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 发送到错误的输入单元。如何在 Python 中使用 pexpect 正确地将输入发送到 FORTRAN 程序?

谢谢你。


编辑:当 p.sendline 的参数为空(egpsendline())或仅包含空格时,程序按预期进行。在向 FORTRAN 程序发送非空格值时,我是否需要以某种方式指定输入格式?

4

1 回答 1

1

pexpect 模块是我以前没有使用过的东西,但可能对我有用,所以我尝试了这个。

编辑:

我无法复制您报告的错误。查看此错误使我相信它与从文件中读取有关,这可能是其他问题的结果。据我所知,这不是 pexpect 旨在直接处理的;但是,您也许可以使其与管道一起使用,例如下面我原始答案中的示例。

我将数据发送到 Fortran 的 I/O 流 5 (stdin) 没有问题。我创建了一个名为 regurgitate 的 Fortran 程序,它发出“Your entry?”提示,然后在 I/O 流 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

正是我所期望的。但是,如果我的 Fortran 程序说出不同的内容(例如“您的输入?”),那么 pexpect 就会挂起或超时。

原建议:

也许这个 pexpect.run() 示例会对您有所帮助。至少它似乎运行了我的反刍程序(一个简单的 Fortran 程序,它接受输入然后将其打印出来):

import pexpect
out = pexpect.run('/bin/bash -c "/bin/cat forty-two | ./regurgitate"')
print out

输出是:

你的条目?
42

regurgitate 在哪里打印出“您的条目?” 提示和四十二个文件包含“42”(在这两种情况下都没有引号)。

于 2011-07-28T20:37:43.347 回答