一。别这么做
我知道您希望将Python代码添加到Fortan程序中,而不是使用带有Fortran扩展的Python程序。我的第一条建议是不要这样做。在数组运算方面,Fortran比Python快,但是Python比Fortran更容易编写,用OOP技术扩展Python代码更容易,Python可以访问对您很重要的库。您提到在Fortran中有一个超级优化的主循环;Fortran对于超级优化的内部循环非常有用。用Numpy在Python程序中传递Fortran数组的逻辑要比用Fortran正确处理Python对象要简单得多。
当我从头开始一个科学计算项目时,我总是先用Python编写,找出性能瓶颈,然后将它们转换成Fortran。能够用经过验证的Python代码来测试更快的Fortran代码,这样就更容易显示代码工作正常。
由于已经有了现有的代码,用Fortran中的模块扩展Python代码需要重构,但是这个过程应该很简单。将初始化代码与主循环分离,将循环分成逻辑部分,将这些例程中的每一个封装在一个Python函数中,然后主Python代码可以调用Fortran子例程,并根据需要将它们与Python函数交错。在这个过程中,您可以在Fortran中保留主循环中的许多优化。F2PY是一个相当标准的工具,所以很容易找到可以帮助你解决任何问题的人。
2。系统调用
如果必须让Fortran代码调用Python代码,而不是相反,那么最简单的方法是让Fortran代码将一些数据写入磁盘,并使用SYSTEM或EXECUTE_COMMAND_LINE运行Python代码。如果您使用EXECUTE_COMMAND_LINE,您可以让Python代码将其结果输出到stdout,并且Fortran代码可以将其作为字符数据读取;如果您有很多输出(例如,一个大矩阵),那么Python代码输出一个Fortran代码随后读取的文件将更有意义。磁盘读/写开销最终可能会对这一点产生非常大的影响。此外,还必须编写Fortran代码来输出数据,编写Python代码来读取数据,编写Python代码来再次输出数据,编写Fortran代码来重新输入数据。这段代码应该很容易编写和测试,但是在编辑代码时保持这四个部分的同步可能会让人头疼。
三。在Fortran中C语言中嵌入Python
我不知道如何将内存中的Python对象直接传递给Fortran。然而,Fortran代码可以调用C代码,C代码可以嵌入Python。(参见Python tutorial on extending and embedding)一般来说,扩展Python(如我在点1中推荐的)最好是将它嵌入到C/C++中。(请参见Extending Vs. Embedding: There is Only One Correct Decision)让它工作将是一场噩梦,因为Python和Fortran之间的任何通信问题都可能发生在Python和C之间,或者C和Fortran之间。我不知道是否有人真的将Python嵌入到Fortran中的C中,因此获得帮助将很困难。