【发布时间】:2012-03-31 00:41:13
【问题描述】:
我有一段 fortran 代码,它从 STDIN 读取一些数字并将结果写入 STDOUT。例如:
do
read (*,*) x
y = x*x
write (*,*) y
enddo
所以我可以从 shell 启动程序并获得以下输入/输出序列:
5.0
25.0
2.5
6.25
现在我需要在 python 中执行此操作。在徒劳地与 subprocess.Popen 搏斗并查看了这个网站上的旧问题后,我决定使用 pexpect.spawn:
import pexpect, os
p = pexpect.spawn('squarer')
p.setecho(False)
p.write("2.5" + os.linesep)
res = p.readline()
它有效。问题是,我需要在 python 和我的 fortran 程序之间传递的 真实 数据是一个包含 100,000 个(或更多)双精度浮点数的数组。如果它们包含在一个名为x 的数组中,那么
p.write(' '.join(["%.10f"%k for k in x]) + os.linesep)
超时并出现来自 pexpect 的以下错误消息:
buffer (last 100 chars):
before (last 100 chars):
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 8574
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
除非 x 的元素少于 303 个。有没有办法向/从另一个程序的 STDIN/STDOUT 传递大量数据?
我曾尝试将数据拆分成更小的块,但随后我的速度损失了 很多。
提前致谢。
【问题讨论】:
-
这是进程间(管道)缓冲的问题。请检查我的答案。
-
我正是遇到了这个问题。感谢您的报道。
标签: python