【问题标题】:Run Fortran command line program within Python在 Python 中运行 Fortran 命令行程序
【发布时间】:2011-03-28 22:54:01
【问题描述】:

所以我有点吃醋了。我正在尝试为 Fortran77 编写绘图和拟合扩展(为什么这个程序在 F77 中重写对我来说也是一个谜,顺便说一句)需要命令行输入的代码,即它提示用户输入。目前该程序使用 GNUplot 进行绘图,但 GNUplot 拟合程序在我看来并不理想,至少可以说从 Fortran 调用 GNUplot 是一件很痛苦的事情。

我主要使用 Numpy、Scipy 和 Matplotlib 来满足我的拟合和绘图需求。我想知道是否有一种方法可以在 Python 中调用 F77 程序,然后让它像运行任何其他 F77 程序一样运行,直到我需要它来适应并吐出一些漂亮的情节(这些 GNUplot 东西都没有)。

我知道 F2PY,但我听到的情况不一。我也考虑过使用 pyexpect 并从那里开始,但我对它处理屏幕上更改的预期提示的方式有不好的体验(或者我只是使用不正确)。

感谢您提供这方面的任何信息。

【问题讨论】:

  • 那么Fortran程序是提示用户输入的交互式程序吗?你可以重写它以接受命令行参数或其他可编写脚本的输入吗?
  • 是的,它基本上会询问您要分析的数据通道以及是否要设置限制或使用默认设置。我知道我可以通过在它上面运行一个 shell 脚本来相当容易地自动化部分,但问题是我们在不同的通道之间来回走动,并且可能想要调整一些参数而不再次运行整个事情。而当前格式的原因在@greg下面的评论中
  • 如果您打算通过标准输出或输出文件从 FORTAN 获取输出(使用 ramdisk 可以非常快),您可以使用subprocess。但我认为您希望以 numpy 数组的形式访问正在运行的 FORTRAN 程序内存?
  • 我当时想做的是编写一个包装器,让 F77 代码完成它的工作,直到它完成,然后 python 接管并从 F77 程序的 FITS 输出文件中提取所有必要的数据生成。 @保罗

标签: python numpy scipy fortran77


【解决方案1】:

难道你不能直接将 Fortran 程序生成的数据转储到一个文件中,然后从 python 中读取吗?

Numpy 可以读取二进制文件并将其视为数组。 从这里到 matplotlib 应该是轻而易举的事。

【讨论】:

  • 所有内容实际上都存储在 FITS 文件中,使用 pyfits 与 python 一起工作是轻而易举的事,而在 F77 中则很痛苦。问题是我的老板希望所有东西都放在一个包中,而不是用 2 种语言拥有 20 个不同的程序(这就是旧版本代码的设置方式)。他认为这使它更“易于维护”。 @fabrizioM
  • @madtowneast:“一个包而不是 20 个不同的程序,用 2 种语言”?这是否意味着您正在重写 Fortran?如果是这样,那就换个问题。如果您不重写fortran,那么这个答案有什么问题?你仍然有两种语言,为什么不运行另一种语言呢?
  • @S.Lott:我根本没用F77写过,我来自C++、python世界。我们只遇到了使用两种语言的问题,尤其是。考虑到其中之一是专有的(IDL),两者之间的相互作用并不理想。 fortran 代码已被其他人从 DEC fortran 重写为 F77,但我有幸调试并添加了他遗漏的部分。我的老板再一次想要fortran,别无其他。我并不是说答案是错误的,我个人会按照@fabrizioM 所说的去做,但我想向我的老板提供一个折衷方案,这里是 F77,那里是 python。
  • @madtowneast:如果代码全是F77,为什么问题标记为Python?
  • @S.Lott:标题说明我想在 Python 中运行 F77 代码...拟合部分还没有写出来,我想用 Python 写,而不是在上面标记一些东西/运行一个单独的程序,我想将python包裹在F77周围。 F77 的问题需要用户通过图形选择和命令行输入。那么Python标签还是错了吗?
【解决方案2】:

听起来你想要做的就是运行 F77 程序,然后解析输出文件,全部来自 python(如果我错了,请纠正我)。最简单的做法是,假设 fortran 程序运行完成,只需将 python 设置为从用户或配置文件中获取输入(请参阅http://docs.python.org/library/configparser.html),然后将这些输入提供给 python 进程模块:

http://docs.python.org/library/subprocess.html

让它运行 F77 可执行文件,然后收集输出并分析/绘制它们。所有 python 脚本所要做的就是准备 fortran 的输入,然后稍后从某个指定位置获取结果。

subprocess 上查看 Doug Hellmann 的这篇优秀教程:

http://www.doughellmann.com/PyMOTW/subprocess/

【讨论】:

  • 将配置文件传递给 F77 的问题在于,基本上用户会在开始时提示选择通道,并且随着处理的继续,必须从 GNUPlot 图中选择一些参数。我以前看过子处理器,但不确定它是否能够做我需要它做的事情,尤其是。与 GNUPlot 中的整个绘图部分。
  • @madtowneast:这就是 STDIN 和 STDOUT 管道的作用。 doughellmann.com/PyMOTW/subprocess/#working-with-pipes-directly 您要么必须将 FORTRAN 管道传递给 Python 用户,要么让 Python 猜测选项。
  • @madtowneast:参数是键入的,还是在 GNUplot 上以图形方式选择的?
  • @Paul:以图形方式选择。我试图让它在 atm 工作,至少是频道选择部分,但是得到了 fortran 代码的输出文件不存在的错误......很奇怪。
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2012-11-10
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多