Python调用Fortran的三种形式
作者:大作家佚名 发布时间:2021-01-10 13:25:08
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读取输出文件,也是一种比较好的选择。
来源:https://blog.csdn.net/wokaowokaowokao12345/article/details/128918409
猜你喜欢
- 前言上篇文章讲的进阶一些的PHP特性不知道大家吸收的怎么样了,今天作为本PHP特性函数的最后一篇,我也会重点介绍一些有趣的PHP特性以及利用
- swagger介绍Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具
- 本文为大家分享了python数据分析数据标准化及离散化的具体内容,供大家参考,具体内容如下标准化1、离差标准化是对原始数据的线性变换,使结果
- 有时候我们不希望浏览器使用缓存加快网页的显示,尤其是那些论坛之类的频繁更新内容的网页,在网上有说可以使用下面的方法来屏蔽缓存,但是我试了效果
- 以下为引用的内容: <html> <head> <title>不刷新页面查询的方法&
- i前端:nput_test.html<!DOCTYPE html><html><head lang="
- BLOG地址:http://www.planabc.net/article.asp?id=107学习标准的朋友,一般都会在学习的过程中接触到
- 有时候,我们需要替换指定标签外的内容,而保留标签里面的内容不替换。比如当我们要在浏览器中显示出编辑器显示的原始格式时、需要将普通换行符“\n
- Mootools 1.2手风琴(Accordion)教程原文地址:30 Days of Mootools 1.2 Tutoria
- 这篇文章主要介绍了Python中断多重循环的几种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 写一个爬虫首先就是学会设置请求头header,这样才可以伪装成浏览器。下面小编我就来给大家简单分析一下python3怎样构建一个爬虫的请求头
- 如何取回已忘记的密码?forget.asp' 申请<html><head><title>闪亮日子
- 本文给出一条 SQL 语句用于展示在同一名服务器上,不同的数据库间查询,注意当前连接用户要对两个库都有权限SQL Server 中 SQL
- 从某个页面表单中取出信息是ASP编程中常见的问题。但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小。简单的GUI界面都可能
- 这篇文章主要介绍了Python3的socket使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 不知大家对精华区的表格排序终极优化是否还有记忆,当时讨论的结果曾以为是最快的JS排序了,实则不然,按前段时间我发的DHTML性能提升帖(转译
- 在用户体验这个行业,经常会听到,可用性,可访问性这样专业的名词,但是,事实上在很多产品实现过程里都忽略了这一点!WHY?举个很简单的例子,用
- 前言Python用于处理文本数据绝对是个利器,极为简单的读取、分割、过滤、转换支持,使得开发者不需要考虑繁杂的流文件处理过程(相对于JAVA
- WEB标准,从我大二开始接触到毕业后的第一份工作“页面重构工程师”,从接触标准到蓝色理想标准区版主的四年多时间里,WEB标准已经成为我生活中
- 之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查;后面程序在国外机器上,例如说韩国