问题描述
我想编写一个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)