Python调用Fortran的三种形式

 更新时间:2023年04月13日 09:24:59   作者:大作家佚名  
这篇文章主要介绍了在Python中调用Fortran的三种形式,文中有详细的代码示例,感兴趣的同学可以参考阅读

1. 简介

在一些研究领域很多经典算法和工具都由上古语言Fortran编写,而这部分代码又没有对应的C/C++和Python版本。因此,掌握Python语言调用Fortran程序这一技能,在一些研究领域有助于我们站在巨人的肩上看的更远。Python调用Fortran可以总结为如下三种:
1)通过 F2PY:F2PY 是 NumPy 团队开发的一个工具,可以把 Fortran 程序转换为 Python 模块,从而在 Python 中调用 Fortran 程序。
2)通过 ctypes 库:ctypes 是 Python 内置的一个库,可以用来调用外部 C 动态链接库,因此也可以用于调用 Fortran 程序。通过 ctypes 可以让 Python 调用 Fortran 程序,也可以从 Fortran 中调用 Python 函数。
3)利用Python的os包调用Fortran。

2. Python调用Fortran的三种方法

2.1 基于 F2PY的f2py调用Fortran

步骤1:

计算圆面积的Fortran函数。接下来将用下面的函数进行演示。这里的例子是返回一个参数的,返回多个参数以及修改参数的Fortran用法。
Fortran77定义变量时候不用加::

function area_of_circle (r)  
! function result     
implicit none      
   ! dummy arguments        
   real :: area_of_circle   
   ! local variables 
   real :: r     
   real :: pi
   pi = 4 * atan (1.0)     
   area_of_circle = pi * r**2  
end function area_of_circle

function area_of_circle (r) result(a)
implicit none
   real :: a
   real :: r
   real :: pi
   pi = 4 * atan (1.0)
   a = pi * r**2
end

subroutine area_of_circle (r,a)
implicit none
   real, intent(out) :: a
   real, intent(in) :: r
   real :: pi
   pi = 4 * atan (1.0)
   a = pi * r**2
end

步骤2:

新建circle.f90后,在终端中运行如下代码:

python -m numpy.f2py -c circle.f90 -m circle

具体步骤如下图,然后可以看到生成的circle.cpython-36m-x86_64-linux-gnu.so

步骤3:

在Python中,可以直接import上面的函数名

import circle
print(circle.__doc__)
print(circle.area_of_circle(2))

注意上面的__doc __是f2py自动生成的,可以看到fortran模块里面包含几个函数,每个函数里面还可以再调用doc看到接口参数类型。

2.2 使用动态链接库调用Fortran

步骤1:

修改上面的Fortran代码,用result返回函数结果,指定输入和返回数据类型。

function area_of_circle(r) result(area) bind(c, name='area_of_circle')
    use iso_c_binding
    implicit none
    real(c_double) :: area
    real(c_double), intent(in) :: r
    real :: pi
    pi = 4 * atan (1.0)
    area = pi * r**2
end function area_of_circle

步骤2:

2.1节 所示,在系统终端或者Pycharm终端中输入命令:

 gfortran -shared circle2.f90 -o circle2.so

步骤3:

编写Python调用脚本

import ctypes as ct

# import the shared library
fortlib = ct.CDLL('./circle2.so')

# Specify arguments and result types
fortlib.area_of_circle.argtypes = [ct.POINTER(ct.c_double)]
fortlib.area_of_circle.restype = ct.c_double

# Create a double and pass it to Fotran (by reference)
a = ct.c_double(2)
b = fortlib.area_of_circle(ct.byref(a))
print(b)

2.3 利用Python的os包调用Fortran

步骤1:

以2.1节中的Fortran代码为例,稍作修改,这种方式需要Fortran代码是完整的程序可编译为可执行程序。下面代码包含了主函数,即调用函数的函数主体。

program calling_func
   real :: a
   a = area_of_circle(2.0)
   Print *, "The area of a circle with radius 2.0 is"
   Print *, a
end program calling_func

function area_of_circle(r)
! function result
implicit none
   ! dummy arguments
   real :: area_of_circle
   ! local variables
   real :: r
   real :: pi
   pi = 4 * atan (1.0)
   area_of_circle = pi * r**2
end function area_of_circle

步骤2:

编译和调用,Windows系统注意修改路径,以及可执行程序名后缀应该是exe,Linux可执行程序后缀可以是out或者没有。

import os
#编译
os.system(r"gfortran  ./circle3.f90 -o circle")
#调用编译的circle程序
os.system('./circle')

上述代码就是类似于Windows中调用cmd。

3. 总结

方法1:比较推荐,针对Python编程,如果返回数据类型复杂,也不是太方便;
方法2:过于繁琐不推荐;
方法3:是一种需要首先编译出可执行程序然后调用,交互性不方便。如果将输入输出写为固定文件,然后由Python生产输入文件,由Python读取输出文件,也是一种比较好的选择。

到此这篇关于Python调用Fortran的三种形式的文章就介绍到这了,更多相关Python调用Fortran内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python的Django框架中的URL配置与松耦合

    Python的Django框架中的URL配置与松耦合

    这篇文章主要介绍了Python的Django框架中的URL配置与松耦合,文中简单讲解了这一松耦合原则,需要的朋友可以参考下
    2015-07-07
  • PyTorch中torch.utils.data.DataLoader实例详解

    PyTorch中torch.utils.data.DataLoader实例详解

    torch.utils.data.DataLoader主要是对数据进行batch的划分,下面这篇文章主要给大家介绍了关于PyTorch中torch.utils.data.DataLoader的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Python多线程入门学习

    Python多线程入门学习

    这篇文章主要介绍了Python多线程入门学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • Python网络爬虫之爬取微博热搜

    Python网络爬虫之爬取微博热搜

    这篇文章主要介绍了Python网络爬虫之爬取微博热搜的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • python下10个简单实例代码

    python下10个简单实例代码

    最近学python比较顺手,找到感觉了,所以,我想把我用来练习的实例题目分享出来,有兴趣的朋友可以关注一下。 文章分为10篇,每篇10题,共100道实例。后续如果需要可以增加
    2017-11-11
  • Python实现截取PDF文件中的几页代码实例

    Python实现截取PDF文件中的几页代码实例

    今天小编就为大家分享一篇关于Python实现截取PDF文件中的几页代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • python 将字符串转换成字典dict

    python 将字符串转换成字典dict

    将字符串转化成字典dict类型?这个可以用python的标准库simplejson 转换为JSON格式。
    2013-03-03
  • python工具——Mimesis的简单使用教程

    python工具——Mimesis的简单使用教程

    这篇文章主要介绍了python工具——Mimesis的简单使用教程,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python中reduce()函数的用法详细解读

    Python中reduce()函数的用法详细解读

    这篇文章主要介绍了Python中reduce()函数的用法详细解读,reduce函数是通过函数对迭代器对象中的元素进行遍历操作,但需要注意的是 reduce 函数返回的是计算的结果,而 map/filter 返回的是作用后的迭代器对象,需要的朋友可以参考下
    2023-08-08
  • 如何利用Python实现简单C++程序范围分析

    如何利用Python实现简单C++程序范围分析

    这篇文章主要介绍了如何利用Python实现简单C++程序范围分析,文章以举例说明及过程实现思路的方式展开讲解,具有一定的的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02

最新评论