首页 > 解决方案 > 与 FORTRAN shell 程序进行交互通信

问题描述

DAOPHOT 是 FORTRAN 编写的软件,用于在图像中执行天文任务。它的典型使用流程是:

  1. 打开一个终端(在我的例子中是 gnome-terminal)并运行./daophot. 我现在在 DAOPHOT 的外壳中。
  2. 提示用户输入命令,假设ATTACH输入图像文件。DAOPHOT 运行并再次提示用户输入更多命令。
  3. 用户给出另一个命令,比方说PHOTOMETRY。DAOPHOT 运行并再次提示用户。

对于用户给出的每一个命令,DAOPHOT 都会一次又一次地运行和提示,直到exit输入。就我而言,我有三个特定的命令将一个接一个地运行,没有变化(和ATTACH,后者可能运行不止一次)。PHOTOMETRYPSF

现在我只是在尝试ATTACH一个文件。我试过的:

使用, 如此此处subprocess所见/询问:

import subprocess

p = subprocess.Popen(["gnome-terminal","--disable-factory","--","./daophot"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdin.write(input("ATTACH file.fits"))

对于这种情况,DAOPHOT 的外壳打开,但未执行 ATTACH 命令。我关闭 shell,字符串“ATTACH file.fits”出现在 IPython 终端中,结束子进程。我也尝试过使用p.communicate(input=input("ATTACH file.fits")),但得到了相同的结果。

使用, 如此此处pexpect所见/询问:

import pexpect

p = pexpect.spawn("gnome-terminal --disable factory -- ./daophot")
p.expect(pexpect.EOF)
p.sendline("ATTACH file.fits")

在这种情况下,DAOPHOT 的外壳打开,但 ATTACH 命令不作为输入。

最后,DAOPHOT 包装器已经存在,但我们的想法是在我们的实验室中拥有这个自动和交互式的 Python 版本,以便我们以后可以根据需要进行更改。

根据我对管道的理解,./daophot是一个在内部运行的子进程gnome-terminal,所以当我使用 eg 时,p.stdin.write(input("ATTACH file.fits")我实际上是将这个命令输入到gnome-terminal中,而不是输入到./daophot.

任何帮助深表感谢。

标签: pythonpython-3.xsubprocesspexpect

解决方案


推荐阅读