我有一个从 Python 脚本(作为 ArcGIS 工具)调用的 FORTRAN 程序。我需要将一个数组 Raster_Z(i,j) 从 FORTRAN 传递给 python。
我已阅读有关 Python子进程模块的信息;但是,我在理解如何使用 FORTRAN 做到这一点方面运气不佳。我发现的所有示例都涉及简单的 unix 命令行调用,而不是实际的程序。
有没有人通过内存管道将变量从 FORTRAN 传递到 Python 的经验?
感谢您的时间。
要通过subprocess
模块中的管道将数组传递给 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 函数一样,不需要管道!
您是否也在传递数据 /into/fortran,或者只是传递数据?如果可能的话,我建议不要使用管道,绝对是输入到 fortran 中,如果您使用的是 intel 编译器。查看我对这个问题的回答:https ://stackoverflow.com/a/10103339/1024514
临时文件可能会更好地工作 - 如果在写入数据后立即读取它,无论如何都可能来自操作系统缓冲区。或者编写一个包装器来从 python 调用一个 fortran 函数来使用该数组——虽然我没有在 python 中这样做过。