如何解决与FORTRAN Shell程序进行交互通信
DAOPHOT是FORTRAN编写的软件,用于在图像中执行天文学任务。其用法的典型流程是:
- 打开一个终端(在我的情况下为gnome-terminal)并运行
./daophot
。我现在在DAOPHOT的壳中。 - 提示用户输入命令,例如
ATTACH
,以输入图像文件。 DAOPHOT运行并再次提示用户更多命令。 - 用户给出另一个命令,例如
PHOTOMETRY
。 DAOPHOT运行并再次提示用户。
对于用户给出的每个命令,DAOPHOT运行并一次又一次提示,直到键入exit
。就我而言,我有三个特定的命令可以连续运行,而不会发生变化(ATTACH
,PHOTOMETRY
和PSF
,后者可能运行不止一次)。
现在,我只是在尝试ATTACH
一个文件。我尝试过的:
使用subprocess
,如{/ {3}}和here所问:
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命令。我关闭外壳,字符串“ ATTACH file.fits”出现在IPython终端中,结束了子进程。我也尝试过使用p.communicate(input=input("ATTACH file.fits"))
,但是得到了相同的结果。
使用pexpect
,如{/ {3}}和here所问:
import pexpect
p = pexpect.spawn("gnome-terminal --disable factory -- ./daophot")
p.expect(pexpect.EOF)
p.sendline("ATTACH file.fits")
在这种情况下,DAOPHOT的外壳会打开,但是ATTACH命令不会算作输入。
最后,DAOPHOT包装器已经here,但是我们的想法是在我们的实验室中使用此自动和交互式Python版本,以便以后可以根据需要进行更改。
根据我对管道的理解,./daophot
是gnome-terminal
内部运行的子子流程,因此当我使用例如p.stdin.write(input("ATTACH file.fits")
实际上是将此命令输入gnome-terminal
,而不是./daophot
。
非常感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。