Python 与FORTRAN外壳程序交互通信
DAOPHOT是一个FORTRAN编写的软件,用于在图像中执行天文学任务。其典型使用流程如下:Python 与FORTRAN外壳程序交互通信,python,python-3.x,subprocess,pexpect,Python,Python 3.x,Subprocess,Pexpect,DAOPHOT是一个FORTRAN编写的软件,用于在图像中执行天文学任务。其典型使用流程如下: 打开一个终端(在我的例子中是gnome终端)并运行/daophot。我现在在DAOPHOT的壳里 提示用户输入命令,例如ATTACH,以输入图像文件。DAOPHOT运行并再次提示用户输入更多命令 用户发出另一个命令,比如说测光。DAOPHOT运行并再次提示用户 对于用户发出的每个命令,DAOPHOT都会一次又一次地运行和提示,直到键入exit。在我的例子中,我有三个特定的命令将一个接一个地运行,没有任
/daophot
。我现在在DAOPHOT的壳里ATTACH
,以输入图像文件。DAOPHOT运行并再次提示用户输入更多命令测光
。DAOPHOT运行并再次提示用户exit
。在我的例子中,我有三个特定的命令将一个接一个地运行,没有任何变化(ATTACH
、PHOTOMETRY
和PSF
,后者可能会运行多次)
现在我只是想附加一个文件。我所尝试的:
使用子流程
,如所见/所问和:
在这种情况下,DAOPHOT的shell将打开,但不会执行ATTACH命令。我关闭shell,IPython终端中出现字符串“ATTACH file.fits”,结束子进程。我也尝试过使用p.communicate(输入=输入(“ATTACH file.fits”))
,但得到了相同的结果
使用pexpect
,如所见/所问和:
在本例中,将打开DAOPHOT的shell,但不会将ATTACH命令作为输入
最后,我们已经有了一个DAOPHOT包装器,但是我们的想法是在我们的实验室中有这个自动交互的Python版本,这样我们可以在以后需要时进行更改
从我对管道的理解来看,/daophot
是在gnome终端
内部运行的子进程,因此当我使用例如p.stdin.write(input(“ATTACH file.fits”)
时,我实际上是将这个命令输入到gnome终端
,而不是/daophot
非常感谢您的帮助。您可以将命令写入文本文件,然后像/daophot那样将其重定向到daophot,或者您可以直接将daophot作为子进程而不是通过终端生成?非常好的第一个问题。欢迎使用Stack Overflow!@PranavHosangadi,谢谢您的回答。当我运行/daophot
直接作为一个子流程,我无法实时看到它的发展,这发生在终端中,对于在计算过程中发现不需要的值至关重要。
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"))
import pexpect
p = pexpect.spawn("gnome-terminal --disable factory -- ./daophot")
p.expect(pexpect.EOF)
p.sendline("ATTACH file.fits")