从Python调用一个写入文件的程序——我能避免IO吗?

从Python调用一个写入文件的程序——我能避免IO吗?,python,linux,subprocess,Python,Linux,Subprocess,在python中,可以使用(例如)subprocess.Popen运行程序并根据需要重定向stdout或stderr,以便处理输出 您能用直接写入文件的被调用程序来实现这一点吗 我有一个fortran程序,它将结果作为文件写入(它也将中间结果作为文件写入)。现在,我正在从Python(2.7)调用这个程序,等待它完成,并在中读取输出文件 但我必须经常并行地执行此操作,并且I/O占用运行时的很大一部分时间 如果不修改直接写入文件(而不是标准输出)的fortran程序,我是否可以直接从python捕

在python中,可以使用(例如)
subprocess.Popen
运行程序并根据需要重定向stdout或stderr,以便处理输出

您能用直接写入文件的被调用程序来实现这一点吗

我有一个fortran程序,它将结果作为文件写入(它也将中间结果作为文件写入)。现在,我正在从Python(2.7)调用这个程序,等待它完成,并在中读取输出文件

但我必须经常并行地执行此操作,并且I/O占用运行时的很大一部分时间


如果不修改直接写入文件(而不是标准输出)的fortran程序,我是否可以直接从python捕获I/O,避免写入磁盘?

不修改fortran程序的最简单方法可能是-与管道的想法相同,但持久(不与任何一个进程绑定)并通过文件系统可见

假设我们有一个简单的Fortran程序:

program writer

    integer,parameter :: u=10
    integer :: i
    real    :: x
    open(u,file='output.dat')
    do i=1,10
        x = (i-1)*0.5
        write(u,*) i, x, x**2, x**3
    end do
    close(u)
end program writer
当运行时,它提供所需的输出:

       1   0.000000       0.000000       0.000000
       2  0.5000000      0.2500000      0.1250000
       3   1.000000       1.000000       1.000000
       4   1.500000       2.250000       3.375000
       5   2.000000       4.000000       8.000000
       6   2.500000       6.250000       15.62500
       7   3.000000       9.000000       27.00000
       8   3.500000       12.25000       42.87500
       9   4.000000       16.00000       64.00000
      10   4.500000       20.25000       91.12500
我们知道输出文件将是
output.dat
(因为它是硬编码的,或者作为选项提供的)

我们可以创建一个名为output.dat的命名管道,并从另一个程序读取它,它的行为就像我们将现有Fortran程序的输出管道传输到另一个命令一样-即使Fortran程序没有写入stdout或stderr:

$ rm output.dat
$ mkfifo output.dat
$ awk '{print "Got line: ",$0}' < output.dat &
[1] 69609
$ ./writer
$ Got line:             1   0.000000       0.000000       0.000000
Got line:             2  0.5000000      0.2500000      0.1250000
Got line:             3   1.000000       1.000000       1.000000
Got line:             4   1.500000       2.250000       3.375000
Got line:             5   2.000000       4.000000       8.000000
Got line:             6   2.500000       6.250000       15.62500
Got line:             7   3.000000       9.000000       27.00000
Got line:             8   3.500000       12.25000       42.87500
Got line:             9   4.000000       16.00000       64.00000
Got line:            10   4.500000       20.25000       91.12500

[1]+  Done                    awk '{print "Got line: ",$0}' < output.dat 
$ rm output.dat
跑步可以带来:

$ python readFifo.py
Got: i  =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     x  =  [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
     x^2=  [0.0, 0.25, 1.0, 2.25, 4.0, 6.25, 9.0, 12.25, 16.0, 20.25]

非常感谢你详细的回答。这正是我需要的。
$ python readFifo.py
Got: i  =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     x  =  [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
     x^2=  [0.0, 0.25, 1.0, 2.25, 4.0, 6.25, 9.0, 12.25, 16.0, 20.25]