目录

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
    • 下载链接1:Downloads - MinGW-w64
    • 下载链接2:​​​​​​mingw-w64-install.exe​​​​​​
    • 提取码:c8z7
    • 注意:mingw-w64下载完成后,记得将gfortran.exe和gcc.exe文件所在的路径添加到系统环境变量,例如在我的电脑上这个路径为:D:\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin
  • python环境:我的电脑上的用来测试的是python3.7.11,并且安装了numpy

2、测试实例

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

module modreal, allocatable, dimension(:,:) :: b
containssubroutine foointeger kif (allocated(b)) thenprint*, "b=["do k = 1,size(b,1)print*, b(k,1:size(b,2))enddoprint*, "]"elseprint*, "b is not allocated"endifend 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函数或子程序https://www.dazhuanlan.com/juanpeaceandjoy/topics/1018954

f2py编译fortran程序(windows)https://zhuanlan.zhihu.com/p/372037523

creating distributable windows python module with f2pyhttps://stackoverflow.com/questions/9756212/creating-distributable-windows-python-module-with-f2py

numpy中文网https://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 Pythonhttps://github.com/space-physics/lowtran

f2py-exampleshttps://github.com/scivision/f2py-examples

windows下python利用f2py调用Fortran相关推荐

  1. windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法

    windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法 问题环境 问题描述 问题原因 & 解决办法 问题环境 Windows 10 x64 .python 3.8. ...

  2. Windows 下 C++ 利用 OpenCV glob 函数获取文件夹下所有文件绝对路径

    绪论 本文记录 Windows 下 C++ 利用 OpenCv glob 函数得到 文件夹下所有文件的绝对路径(含文件名).本文还含有 std::string::find()等函数的记录.如果是 Py ...

  3. Python利用JPype调用Java对象方法【实现在Python中调用JAVA】

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  4. 简述Linux和Windows下Python搭建步骤

    简述就Windows和Linux环境下安装Python的步骤. Python环境搭建首先到官网(www.python.org)下载相应的安装版本.主要分为Windows和Linux两种: 一.Linu ...

  5. Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题

    Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题 参考文章: (1)Windows下Python 3.6 ...

  6. windows下python环境搭建_Linux/Windows下Python环境搭建步骤

    Python环境搭建首先到官网(www.python.org)下载相应的安装版本.主要分为Windows和Linux两种: 一.Linux下Python环境搭建 一般情况下,Linux系统都已经预安装 ...

  7. Windows 下python的tab自动补全

    Windows 下python的tab自动补全 对于新学python的朋友来说,python模块的功能多而难记,mac和Linux中有tab自动补全命令功能,使用Windows的同学们怎么办?下面我们 ...

  8. python2没有pip命令_解决Windows下python和pip命令无法使用的问题

    一. python命令找不到 安装python之后经常会出现下面的问题 , python命令找不到,这是因为Windows的环境变量中没有定义python的安装路径 这个时候我们先找到python的安 ...

  9. python3.7安装步骤-Windows下Python 3.7.0的安装步骤,Python370

    Windows下Python 3.7.0的安装步骤 由于Python版本太新的话,能会出现不稳定的情况,所以在这里,作者建议用版本不太新的Python.在这里,我用的是Python3.7.0版本(其他 ...

最新文章

  1. linux基础—课堂随笔010_系统启动和内核管理
  2. 改造HINT的输出方式
  3. 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
  4. 今晚19:15,商汤校招空宣准点开播 | 你想知道的校招资讯都在这里!
  5. 收藏一下mybatis全局参数配置
  6. 在OUTLOOK或OWA中查看邮件的SCL级别(转)
  7. 腾讯视频如何退出登陆
  8. 关于Js(四)------ jquery ajax 中json接收数据注意事项
  9. shell 免杀aspx_对于asp免杀webshell的一些总结
  10. NUC1076 LCD-Display【打印图案】
  11. 虚拟机桥接模式-CentOS下配置静态IP
  12. VMD的相关命令(转载)
  13. h5页面编写注意事项,自己遇到的小问题。
  14. php商城教学视频教程,布尔教育ThinkPHP商城实战视频教程的课件源码分享
  15. Unity零基础入门 - 打砖块(Unity 2017)
  16. 计算机课程没电脑怎么讲课,停课不停学,学生家里没有电视、智能手机和电脑,怎么上网课?...
  17. python 地形图_Python-Evoked地形图可视化
  18. MySQL基础学习2
  19. 敏捷结果30天之第十一天:高效能、慢生活
  20. R语言生存分析可视化分析

热门文章

  1. 自动和手动开启无障碍服务的方式
  2. 【java笔记】Map,HashMap,Collections
  3. 指数基金系列(一)-开篇(2019-12-19 迁移到雪球更新)
  4. Java保留小数点后两位方法(推荐使用NumberFormat)
  5. 研磨设计模式之装饰模式-3(转)
  6. java web怎么实现跳转,成都汇智动力-JAVAweb路径跳转实现教程
  7. PHP笔记-laravel中使用jquery及jquery.niceScroll.js
  8. JavaScript while
  9. 通过 GCC 学习 OpenMP 框架
  10. 某大学生写给女朋友的信