【问题标题】:Interfacing Python With Fortran through Command-Line Using Pexpect使用 Pexpect 通过命令行将 Python 与 Fortran 连接
【发布时间】:2011-07-28 17:09:19
【问题描述】:

我正在使用 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 程序发送非空格值时,我是否需要以某种方式指定输入格式?

【问题讨论】:

  • 这没什么好说的。如果您需要更多帮助,您需要提供更多关于您的程序以及您如何使用它们的数据,尤其是 Fortran 程序期望如何获取数据。
  • 关于 pexepect 很重要的一点:它只能在 linux 下运行。有一个 windows 端口,但我遇到了很多问题让它在我的盒子上运行。

标签: python fortran stdout stdin pexpect


【解决方案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”(两种情况下都没有引号)。

【讨论】:

  • 问题似乎与正在发送的换行符有关。如果我 child.sendline('42'),我得到上述错误。 child.sendline()、child.sendline(" ") 或任何只有空格作为内容的参数都不会产生错误。我还尝试关注 child.send('42'),它可以工作,但由于现在使用 child.sendline() 尾随 CR/LF,它不会“提交”内容,但这又会引发上述错误。你知道我还能尝试解决这个问题吗?
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多