【问题标题】:Save command line output to variable in Fortran将命令行输出保存到 Fortran 中的变量
【发布时间】:2018-11-23 13:32:13
【问题描述】:

有没有办法将命令行实用程序的输出存储到 Fortran 中的变量中?

我有一个基于 BASH 的实用程序,它给了我一个需要在 Fortran 程序中使用的数字。我想通过程序本身调用该实用程序,并尽可能避免将输出写入文件。

可能是这样的吗?

integer a
write(a,*) call execute_command_line('echo 5')

或者像这样?

read(call execute_command_line('echo 5'),*) a

不过,我认为其中任何一个都不对。我想知道是否真的有一种方法可以做到这一点。我阅读了execute_command_line 的文档,但我认为没有执行此操作的子例程的输出参数。

【问题讨论】:

  • 您必须使用临时“文件”。我无法立即找到我认为涵盖此的问题,但在 this one 中进行了一些讨论。
  • 我一直在尝试制作问题中提到的 fortranposix 库,但未能成功(Makefile 中不存在目标文件的 fPIC 错误)。在我弄清楚时,是否还有其他库可以将诸如 popen 之类的 posix 功能添加到 Fortran 中?或者任何其他不依赖于外部非默认库的方式? @francescalus
  • 一些编译器在它们的运行时捆绑了类似 POSIX 的东西,所以你可能会很幸运。但是,老实说,我只是将命令的标准输出写入一个真实文件,然后从我的 Fortran 程序中读取它。
  • 问题是,这将进入一个数百万代的差分进化程序,有 40 个模型,每个模型有 4 个模型参数,循环超过 120 个数据点,因此总迭代次数最多为 19200000000。我不知道每次写入文件然后从中读取是否是最好的选择。编写差分进化算法的全部目的是让事情变得更快。我宁愿不必在每次迭代中读写文件
  • 这篇关于命名管道的文章很有意思networkworld.com/article/3251853/linux/…(说的一切都是在内存上进行的。但不知海量的系统调用后台是没问题还是有什么实际问题... )

标签: fortran gfortran


【解决方案1】:

由于您使用的是 BASH,假设您正在开发某种类 unix 系统。所以你可以使用FIFO。类似的东西

program readfifo
  implicit none
  integer :: u, i
  logical :: ex
  inquire(exist=ex, file='foo')
  if (.not. ex) then
     call execute_command_line ("mkfifo foo")
  end if
  call execute_command_line ("echo 5 > foo&")
  open(newunit=u, file='foo', action='read')
  read(u, *) i
  write(*, *) 'Managed to read the value ', i
end program readfifo

请注意,FIFO 的 wrt 阻塞的语义可能有点棘手(这就是为什么 echo 命令后面有 '&',您可能需要阅读一下并进行实验(特别是确保您没有当您多次执行此操作时,会出现无数 bash 进程)。

【讨论】:

  • 那么,使用命名管道比使用普通文件更快吗?就像上面的代码一样,如果我不使用命令mkfifo foo,只是将它写入一个普通文件,然后从中读取,它会比较慢吗?因为据我了解,即使制作命名管道也必须将文件写入磁盘
  • @Yuki.kuroshita:嗯,你必须在目录中创建 FIFO 条目是的,但是所有进出该 FIFO 的 I/O 永远不会命中文件系统。因此,如果您只创建一次 FIFO,然后在 Fortran 中将其保持打开状态,我想它会非常有效。嗯,大致和管道一样高效,因为它就是这样。
  • 谢谢您的解释
  • 系统命令末尾的&有什么作用?我认为,为了获得所需的行为,您必须这样做 call execute_command_line("echo 5 > foo",WAIT=.t.)
猜你喜欢
  • 2011-12-31
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
相关资源
最近更新 更多