将python嵌入fortran 90

2024-05-19 00:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在考虑将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库)。


Tags: 方法答案代码功能numpy语言时间场景
3条回答

如果要在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)通常更可取,但是嵌入有其用途:

  • 大型的、现有的Fortran代码可能需要大量的重构 它们可以从Python中使用-这里嵌入可以节省开发时间
  • 用Python实现替换现有代码的一部分
  • 临时嵌入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代码将一些数据写入磁盘,并使用SYSTEMEXECUTE_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中,因此获得帮助将很困难。

相关问题 更多 >

    热门问题