Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与FORTRAN外壳程序交互通信_Python_Python 3.x_Subprocess_Pexpect - Fatal编程技术网

Python 与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是一个FORTRAN编写的软件,用于在图像中执行天文学任务。其典型使用流程如下:

  • 打开一个终端(在我的例子中是gnome终端)并运行
    /daophot
    。我现在在DAOPHOT的壳里
  • 提示用户输入命令,例如
    ATTACH
    ,以输入图像文件。DAOPHOT运行并再次提示用户输入更多命令
  • 用户发出另一个命令,比如说
    测光
    。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")