如何运行可执行文件,然后在Fortran中读取输出文件?

问题描述

我想编写一个Fortran程序,该程序可以运行名为external_program.x的可执行文件,然后等待,直到生成一个名为output.dat输出文件,该文件包含10行3D坐标。输出文件如下所示:

0.8 1.8 2.8
1.2 1.3 1.4
2.2 2.3 2.4
5.4 5.3 5.1
2.5 2.6 2.7
1.0 1.1 1.2
0.8 0.2 0.1
4.4 4.3 4.2
2.5 2.1 1.2
3.5 3.6 3.9

我编写了以下Fortran代码,但是它不起作用,因为主脚本不会等待作业完成,而是直接读取尚不存在的输出文件。我不想实现睡眠,因为输出文件将以极快的速度(在0.1秒内)生成,并且睡眠会使它非常慢。我什至不知道如何在fortran中实现睡眠。有没有办法在工作完成后立即获取stdout?我在wait=.true.中尝试过execute_command_line,但没有用。

real dimension(10) :: x,y,z
real,dimension(10,3) :: coords
integer :: i

! run executable
call execute_command_line ("./external_program.x",wait=.true.)

! read output file
open (unit=99,file="output.dat",status="old")
do i=1,10
  read(99,*) x(i),y(i),z(i)
  coords(i,1) = x(i)
  coords(i,2) = y(i)
  coords(i,3) = z(i)
end do
close(99)

do i=1,10
  print "(F20.8,F20.8,F20.8)",coords(i,1),2),3)
end do

解决方法

在我的头上,我可以想到以下实现目标的方法。

方法1(我的首选方式):外部程序的调用通常由脚本语言完成,而我将使用python。您可以在此处轻松地检查命令是否已完成以及输出文件是否存在/大小正确。如果为true,则可以从python脚本调用fortran程序。

方法2:选项wait=.true.将使您的fortran程序等待,直到另一个程序完成。但是有一个小问题:我想输出可能仍在编写过程中,这就是为什么您遇到错误的原因。也许您想使用一种解决方法,要么等待特定的时间(sleep命令可能对gfortran-doc有所帮助),或者/并且您可以检查文件是否存在并且大小正确。

  • 检查文件是否存在:inquire(file="myfile.csv",exist=file_exists)
  • 检查文件的大小:inquire(file="myfile.csv",size=file_size)