如何 运行 一个可执行文件,然后用 Fortran 读取输出文件?

How to run an executable and then read the output file in 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 ?我在 execute_command_line 中尝试了 wait=.true.,但它不起作用。

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), coords(i,2), coords(i,3)
end do

在我的脑海中,我可以想到以下方法来实现您的目标。

方法一(我喜欢的方式): 外部程序的调用通常是通过脚本语言完成的,我会使用python。在那里您可以轻松检查命令是否已完成以及输出文件 exists/is 的大小是否正确。如果为真,那么您可以从 python 脚本调用您的 Fortran 程序。

方法 2: 选项 wait=.true. 将使您的 Fortran 程序等待其他程序完成。但是有一个小问题:我猜想输出可能仍在写入过程中,这就是您遇到错误的原因。也许您想使用一种变通方法,您可以等待特定时间(sleep 命令可能会有帮助 gfortran-doc)or/and 您可以检查文件是否存在并且大小正确。

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