python - 与 FORTRAN shell 程序进行交互通信
问题描述
DAOPHOT 是 FORTRAN 编写的软件,用于在图像中执行天文任务。它的典型使用流程是:
- 打开一个终端(在我的例子中是 gnome-terminal)并运行
./daophot
. 我现在在 DAOPHOT 的外壳中。 - 提示用户输入命令,假设
ATTACH
输入图像文件。DAOPHOT 运行并再次提示用户输入更多命令。 - 用户给出另一个命令,比方说
PHOTOMETRY
。DAOPHOT 运行并再次提示用户。
对于用户给出的每一个命令,DAOPHOT 都会一次又一次地运行和提示,直到exit
输入。就我而言,我有三个特定的命令将一个接一个地运行,没有变化(和ATTACH
,后者可能运行不止一次)。PHOTOMETRY
PSF
现在我只是在尝试ATTACH
一个文件。我试过的:
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"))
,但得到了相同的结果。
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
.
任何帮助深表感谢。
解决方案
推荐阅读
- laravel - 按数组顺序附加数据透视表 id
- c# - 我的服务堆栈服务中的异常没有将消息移动到死信队列
- encryption - OpenResty lua-resty-string:无法解密由 Crypto-JS 加密的密码(AES 默认)
- java - 如何使用其他 DTO 来减少 Spring Boot 中的 if 语句
- ios - 检查哪个 UIScrollView 正在滚动?
- travis-ci - Travic CI 提交失败(coverage_clover XML 文件不可读)
- teamcity - TeamCity 正在用星号替换特定短语
- cassandra - 使用 Cassandra 表作为键值对的正确做法是什么。并对该表执行批量读写
- javascript - Highcharts 图例显示异常管道
- php - 多个相邻结果对的总和