使用Pexpect通过命令行连接Python和Fortran

时间:2011-07-28 17:09:19

标签: python fortran stdout stdin pexpect

我正在使用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的参数为空(例如p.sendline())或仅包含空格时,程序按预期进行。在向FORTRAN程序发送非空格值时,是否需要以某种方式指定输入格式?

1 个答案:

答案 0 :(得分:1)

pexpect模块以前我没用过,但对我有用,所以我试过了。

修改

我无法复制您报告的错误。看看这个错误让我相信它与从文件中读取有关,这可能是其他问题的结果。从我所看到的,这不是pexpect旨在直接处理的;但是,你可能能够使用管道,就像我原来的答案中的例子一样。

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

哪里反刍打印出“你的参赛作品?”提示和四十二个文件包含“42”(两种情况下都没有引号)。