起因:不想把fortran结果手动搬到excel里画图表
先在window系统试,
使用f2py方法的时候总是报错has fortran sources but no fortran compiler found,或者not supported between instances of 'nonetype' and 'str'。
使用dll+ctypes库的时候,总是报错try using the full path with constructor syntax,或者could not find module 'xx.dll' (or one of its dependencies)。
网上的各种解决方法都试过了,都没用,可能是因为我的python和fortran编译器装在不同的盘里?非计算机类专业,无法理解环境变量之类的东西。
为了实现用python调用fortran的执念,我给电脑装了ubuntu,不是虚拟机,然后装了conda(网上有很多教程,tb也有代装)。这时候系统已经带有python了。而且没有安装编译器,点开py文件和f90文件,里面已经有那种彩色标注方便阅读了,没有撤销选项,但用ctrl+z可以撤销,所以不用安装编译器了。
建立一个文件夹,右键在终端打开。先了解两个linux系统常用操作:cd和touch
touch cal_es.py !建立一个py文件
touch test.f90 !建立一个f90文件
cd where\where !从当前文件夹进入里面的哪个文件夹
cd .. !退出一层文件夹
按下面这样在终端输入,来安装gfortran,一点小问题就是输密码的时候密码不会显示在终端上,正常输就好了。我写了一个名为test.f90的简单program试用一下。遇到一个报错-Werror=line-truncation,原因是把一行写得太长了,解决方法是在较长的行里插入换行连续符&并换行。
sudo apt-get install gfortran
gfortran --version
touch test.f90!创建,然后点开这个文件写一段可执行的fortran代码
gfortran test.f90!生成a.out
./a.out!执行结果
然后写了一个名为es.f90的subroutine,如下。注意subroutine里面要写标签,就是以!f2py开头的那两句,以及一个f90文件里可以有多个subroutine。
subroutine es1(t,e)
implicit none
double precision t,e
!f2py intent(in)::t
!f2py intent(out)::e
e=t+1
return
end
用f2py生成把它转换成包,这是在终端输入的:
f2py -c es.f90 -m es !生成es.os
报错python.h:no such file or directory,就在终端如下输入,来安装python.h。
sudo apt-get install python-dev
os文件就生成在当前文件夹里了,这时候python还缺很多包,可以用sudo直接安装,也可以安装pip然后安装,但比如sudo能安装的python-tk这个包pip反而安装不了。
pydoc modules !查看安装了哪些python包
pip --version !查看是否安装了xx
sudo apt-get install python-pip !方法一,sudo安装
pip install matplotlib !方法二:pip安装
sudo apt-get install python-tk !解决matplotlib缺少python-tk
然后就可以用之前提到的touch建立py文件,点进去写代码,像这样使用Fortran生成的包:
import es
print(es.es1(2))
es是我取的os文件名,es1是我取的subroutine名,然后开始画我的图了。在linux下python调用fortran算是没怎么遇到error了。