将 FORTRAN 变量传递给 Python



我有一个从Python脚本调用的FORTRAN程序(作为ArcGIS工具)。 我需要将数组 Raster_Z(i,j) 从 FORTRAN 传递给 python。

我已经阅读了有关Python子流程模块的信息;但是,我并没有太多的运气来理解如何使用FORTRAN来做到这一点。 我发现的所有示例都涉及简单的 unix 命令行调用,而不是实际的程序。

没有人有过通过内存管道将变量从FORTRAN传递到Python的经验?

谢谢你的时间。

要通过

subprocess 模块中的 PIPE 将数组传递给 FORTRAN,您需要弄清楚如何将该数组作为命令行参数传递给 FORTRAN。 这是因为 PIPE 使用类似 shell 的接口(如果需要,也可以使用实际的 shell)来调用程序。 为了使用你的方法,我会制作一个看起来像这样的 python 列表:

arguments = [rows, columns] + [x for x in Raster_Z.flatten()]

我假设你正在使用 numpy。 此列表可以通过管道传输到 STDIN。 这样,您告诉 FORTRAN 数组的行数和列数,以便它可以分配内存,然后它将读取扁平数组,您可以根据需要重塑该数组。 平展数组还有一个额外的好处,即删除了从数组的行顺序存储到列顺序存储的讨厌转换。

实际上,我已经使用 PIPE 完成了您想要做的事情,除了我没有通过 STDIN 将数组管道到 FORTRAN 例程,而是将其写入临时文件,然后通过该文件从 FORTRAN 读取它。 我最初试图按照我上面建议的去做,但是我在 FORTRAN 从 STDIN 读取大量数据时遇到了问题......我将此归因于缓冲。 您的里程可能会有所不同,STDIN可能适合您。

或:

您可以使用 f2py 包装您的 FORTRAN 例程,然后将数组直接发送到 FORTRAN,就好像它是一个 python 函数一样,不需要管道!

您是将数据/传入/fortran 也传递,还是只是传出?如果可能的话,我建议不要使用管道,绝对是输入到fortran中,如果您使用的是英特尔编译器。看看我对这个问题的回答:https://stackoverflow.com/a/10103339/1024514

临时文件可能会更好地工作 - 如果在写入后读取数据,则无论如何都可能来自操作系统缓冲区。或者编写一个包装器来调用 python 中的 fortran 函数以就地使用数组——不过我还没有在 python 中这样做。

最新更新