windows下python利用f2py调用Fortran

目录

1、运行环境

2、测试实例

3、参考文章


Fortran(Formula Translation)是世界上第一个被正式推广使用的高级语言,其目前仍然是数值计算领域最重要的编程语言之一,虽然有juliapython等语言兴起,但在传统的工程计算领域如有限元、大规模并行计算等,Fortran积累了丰富的被实际工程验证了的经典算法和代码,这些代码没有被改写成其他语言的必要,最好的方式是混编,而python的第三方库numpy就提供了2种调用Fortran代码的方式

  • 利用numpy中的f2py
  • 利用numpy中的ctypeslib和python基础库ctypes

本文记录的是第一种方式,即利用numpy中的f2py实现对fortran程序的调用,第二种方式下篇再讲。

1、运行环境

  • 运行平台:windows 10
  • 编译器:mingw-w64
  • python环境:我的电脑上的用来测试的是python3.7.11,并且安装了numpy

2、测试实例

参考了numpy中文网中可分配数组的例子,Fortran代码allocarr.f90如下:

module mod
  real, allocatable, dimension(:,:) :: b 
contains
  subroutine foo
    integer k
    if (allocated(b)) then
       print*, "b=["
       do k = 1,size(b,1)
          print*, b(k,1:size(b,2))
       enddo
       print*, "]"
    else
       print*, "b is not allocated"
    endif
  end subroutine foo
end module mod

若使用例子中给到的编译命令:

f2py -c -m allocarr allocarr.f90

会在当前fortran文件目录下产生一个以pyd后缀结尾的文件(python动态库文件)和一个名为allocarr/.lib的文件目录,目录中有一个名字一大长串的以dll结尾的动态链接库

此时直接import allocarr时,提示找不到指定的模块

但将dll文件复制到pyd相同路径下,运行就成功了!

这样用起来很不方便,每次需要用到编译产生的库时,必须同时打包两个文件,并且还不能给dll文件改名,改名后也会提示找不动指定的动态库,如果编译后只会产生一个*.pyd文件多方便,在网上各种查资料,发现只要编译时指定c和fortran的编译器就行,如下

没指定编译器的话不仅产生了.pyd还会产生.dll
f2py -c allocarr.f90 -m allocarr


指定编译器后,只会生成一个.pyd文件,但在别的机器上可能没法运行
参考:https://stackoverflow.com/questions/9756212/creating-distributable-windows-python-module-with-f2py
f2py -c --fcompiler=gnu95 --compiler=mingw32 allocarr.f90 -m allocarr


f2py -c --help-compiler    查看当前系统可用的c和c++编译器
f2py -c --help-fcompiler   查看当前系统可用的Fortran编译器

-static-libgcc               将gcc作为静态库
-static-libgfortran        将gfortran作为静态库
f2py -c --fcompiler=gnu95 --compiler=mingw32 --link-static-libgcc --link-static-libgfortran allocarr.f90 -m allocarr

使用如下命令后,即在当前Fortran文件目录下产生了单个的*.pyd文件,并且在没有安装mingw-64环境下的机器上运行也能成功!!!

f2py -c --fcompiler=gnu95 --compiler=mingw32 --link-static-libgcc --link-static-libgfortran allocarr.f90 -m allocarr

至此大功告成!!!下一节我将记录下numpy.ctypeslib调用fortran踩过的坑!!!

3、参考文章

人工智能 Python笔记(一)——利用F2PY调用Fortran函数或子程序icon-default.png?t=N7T8https://www.dazhuanlan.com/juanpeaceandjoy/topics/1018954

f2py编译fortran程序(windows)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/372037523

creating distributable windows python module with f2pyicon-default.png?t=N7T8https://stackoverflow.com/questions/9756212/creating-distributable-windows-python-module-with-f2py

numpy中文网icon-default.png?t=N7T8https://www.numpy.org.cn/f2py/python-usage.html#%E5%8F%AF%E5%88%86%E9%85%8D%E6%95%B0%E7%BB%84

Lowtran in Pythonicon-default.png?t=N7T8https://github.com/space-physics/lowtran

f2py-examplesicon-default.png?t=N7T8https://github.com/scivision/f2py-examples

Windows 11上使用F2PY可以分为以下几个步骤: 1. 安装Python和Numpy 在Windows 11上安装Python和Numpy可以参考以下步骤: - 访问Python官网(https://www.python.org/)下载最新版本的Python安装程序,并安装Python。 - 打开命令提示符或PowerShell,并使用以下命令安装Numpy: ``` pip install numpy ``` 2. 安装Fortran编译器 F2PY需要使用Fortran编译器来编译Fortran代码。在Windows 11上,可以使用MinGW或者Microsoft Visual Studio (MSVC)等编译器。其中,MinGW是一个免费的、基于GNU编译器集的工具,而MSVC是Windows默认的编译器。 - 安装MinGW - 访问MinGW官网(http://www.mingw.org/)下载最新版本的MinGW安装程序,并安装MinGW。 - 在MinGW安装程序中选择需要安装的组件,包括`gfortran`组件。 - 将MinGW的bin目录(例如`C:\MinGW\bin`)添加到系统环境变量Path中。 - 安装MSVC - 访问Visual Studio官网(https://visualstudio.microsoft.com/zh-hans/downloads/)下载最新版本的Visual Studio安装程序,并安装Visual Studio。 - 在Visual Studio安装程序中选择需要安装的组件,包括C++和Fortran开发工具。 - 在安装完成后,打开Visual Studio,并创建一个Fortran项目,以确保Fortran编译器已经正确安装。 3. 使用F2PY编译Fortran代码 在安装好Python、Numpy和Fortran编译器之后,可以使用F2PY编译Fortran代码,并生成Python调用模块。假设我们已经编写了一个名为`test.f90`的Fortran程序,其中包含一个名为`add`的子程序,可以计算两个整数的和。可以使用以下命令编译Fortran代码: ``` f2py -c -m test_module test.f90 ``` 上述命令将编译Fortran代码,生成一个名为`test_module.pyd`(或者`test_module.dll`)的共享库文件。同时,它还将在Python中创建一个名为`test_module`的模块,其中包含可以调用Fortran子程序`add`的Python函数。 4. 在Python调用Fortran代码 在安装好Python、Numpy、Fortran编译器和生成了Python调用模块后,可以在Python调用Fortran代码。可以使用以下代码: ```python import numpy as np from test_module import add a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = add(a, b) print(c) ``` 在上述代码中,我们首先导入了Numpy库和我们创建的Fortran模块`test_module`中的`add`子程序。然后,我们使用Numpy创建了两个数组`a`和`b`,并将它们作为参数传递给`add`子程序。最后,我们打印输出结果。 以上就是在Windows 11上使用F2PY的步骤。需要注意的是,F2PY需要根据Fortran代码的具体情况进行不同的配置,包括变量类型、数组存储方式、编译器等。因此,在实际使用时需要根据具体情况进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值