我正在考虑将python嵌入到fortran90中,以便将python功能添加到我现有的fortran90代码中。我知道这可以通过另一种方法来实现,即使用numpy中的f2py使用fortran90扩展python。但是,我想在fortran中保留我的超级优化主循环,并添加python来完成一些额外的任务/评估进一步的开发,然后才能在fortran中完成它,还可以简化代码维护。我正在寻找下列问题的答案:
1)是否有一个已经存在的库可以将python嵌入到fortran中?(我知道f2py,它反过来做) 2) 我们如何处理从fortran到python再到python的数据传输? 3) 如何实现回调功能?(让我稍微描述一下这个场景……我有一个fortran语言的主fortran程序,它在Python中调用Func1_Python模块。现在,从这个Func1_Python中,我想调用另一个函数…比如Fortran中的Func2_Fortran) 4) 在fortran中嵌入python解释器对性能的影响是什么……比如加载时间、运行时间、发送数据(一个双精度的大数组)等等
非常感谢您的帮助!!
编辑1:我想通过添加更多关于我正在做的工作的信息来确定讨论的方向。我对科学计算很感兴趣。所以,我会在双精度的大型数组/矩阵上做很多工作,并做浮点运算。因此,除了fortran之外,几乎没有其他选项可以真正为我做这项工作。我想在代码中包含python的原因是,如果需要的话,我可以使用NumPy进行一些基本的计算,并以最小的努力扩展代码的功能。例如,我可以使用几个可用的库来链接python和其他一些包(比如OpenFoam使用PyFoam库)。
如果要在Fortran中嵌入Python,就必须通过Fortran的C接口来实现;这就是ISO-C-u绑定的作用。我警告不要嵌入Python,不是因为这样做的技术困难,而是因为Python(语言或社区)似乎坚决反对将Python用作从属语言。常见的观点是,无论您的代码当前使用的是什么样的非Python语言,都应该分解成库并用于扩展Python,而不是相反。因此,您将看到(如这里所示)更多的回答试图说服您,您真的不想做您实际想做的事情,而不是实际的技术援助。
这不是煽动、社论或道德判断;这是一个简单的事实陈述。如果您尝试嵌入Python,将无法从Python社区获得帮助。
如果您需要的功能超出了Fortran语言本身支持的范围(例如文件系统操作)和您并不特别需要Python和您想要一种比C语言更具表现力的语言,那么您可能需要考虑嵌入Lua。与Python不同,Lua是专门用来嵌入的,因此您可能会面临更少的社会和技术阻力。
有很多项目是integrate Fortran and Lua,到目前为止我看到的最完整的项目是Aotus。作者反应灵敏,集成过程简单。
诚然,这并不能回答最初的问题(如何在Fortran90应用程序中嵌入一个Python解释器),但公平地说,其他任何响应都不能回答。最近,我使用Python作为我的可移植通用语言,在扩展我们的主要产品(用Fortran编写)时,我更愿意坚持使用它。出于上述原因,我放弃了嵌入Python的尝试,转而嵌入Lua;出于社会原因,我觉得Lua是一个更好的技术选择。这不是我的第一选择,但至少对我来说是可行的。
如果我冒犯了任何人,我会道歉;我不是想挑起争执,只是在研究这个特定话题时讲述我的经历。
我已经开发了库^{} ,它允许您在Fortran中使用Python(嵌入)。
它使用Fortran C interoperability调用Python C API函数。
虽然我同意扩展(在Python中使用Fortran)通常更可取,但是嵌入有其用途:
除了嵌入,
Forpy
还支持扩展Python。 使用Forpy
您可以完全用Fortran编写Python扩展模块。 现有工具(如f2py
)的一个优点是可以使用Python数据类型 (例如,编写以Python列表为参数的函数或返回Python dict的函数)。使用现有的(可能是遗留的)Fortran代码通常是非常有挑战性的,我 认为开发人员应该拥有用于嵌入和扩展Python的工具。
一。别这么做
我知道您希望将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代码来重新输入数据。这段代码应该很容易编写和测试,但是在编辑代码时保持这四个部分的同步可能会让人头疼。(此方法在this Stack Overflow question中试用)
三。在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中,因此获得帮助将很困难。
相关问题 更多 >
编程相关推荐