如何 运行 一个可执行文件,然后用 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)
我想编写一个 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)