从Python调用Fortran[英] Calling Fortran from Python

问题描述

你好,

我一直在尝试从 Python
调用以下 Fortran 函数(使用 Windows XP、Compaq Fortran 和 Python 2.4).我试过 F2Py,
Pyfort 和 calldll 都没有成功.

我想我与 calldll 非常接近.这是一个简短的总结

Fortran代码:

子程序示例(IERR1,IERR2,AIN,AOUT)
C
DLL的C简单示例
C
!DEC$ATTRIBUTES DLLEXPORT :: 示例
!DEC$ATTRIBUTES 别名:''SAMPLE'' :: SAMPLE
INTEGER,INTENT(OUT) :: IERR1,IERR2
REAL*8,INTENT(IN) :: AIN(*)
REAL*8,INTENT(OUT) :: AOUT(*)
C
C *** 设置数组 AIN 和 AOUT 的最大预期元素
C
参数(MAXNVIN=101,MAXNVOUT=200)
C
C *** 将错误指标设置为零
C
IERR1=0
IERR2=0
C
C *** 获取输入值的数量
C
NVIN=AIN(1)
C *** IF NUMBER 超出最大预期集错误并返回
如果(NVIN.GT.MAXNVIN)那么
IERR1=1
IERR2=1
返回
ENDIF
C
C *** 设置输出值的数量
C
NVOUT=2*NVIN
C *** IF NUMBER 超出最大预期集错误并返回
IF(NVOUT .GT.MAXNVOUT) 那么
IERR1=1
IERR2=2
返回
ENDIF
C
C *** 初始化 AOUT 索引
C
JOUT=0
C
C *** 为每个输入值计算两个输出值
C
DO I=1,NVIN
JOUT=JOUT+1
AOUT(JOUT)=2.*AIN(I+1)
JOUT=JOUT+1
AOUT(JOUT)=3.*AIN(I+1)
结束
返回


将其编译为 dll 并从另一个 Fortran 程序调用此 dll
成功了,所以这告诉我 dll 没问题.

这就是我尝试从 python 2.4 调用它的方式

导入调用dll
handle = calldll.load_library(''c:/sample_dll.dll'')
addr = calldll.get_proc_address(handle, ''SAMPLE'')
#到目前为止一切顺利,我得到了句柄和地址
e1 = 0
e2 = 0
ain = [2, 3, 4]
aout = [ ]
calldll.call_foreign_function(addr, ''hhll'', ''l'',(e1, e2,ain,aout))
Traceback(最近一次通话最后一次):
文件"<交互式输入>",第 1 行,在 ?
TypeError: 需要一个整数

有人用 Pyfort、F2Py 或 calldll 提供过类似的例子吗?

在此先感谢.

推荐答案

ATTRIBUTES DLLEXPORT :: SAMPLE
!DEC

属性别名:''SAMPLE'' :: SAMPLE
INTEGER,INTENT(OUT) :: IERR1,IERR2
REAL*8,INTENT(IN) :: AIN(*)
REAL*8,INTENT(OUT) :: AOUT(*)
C
C *** 设置数组 AIN 和 AOUT 的最大预期元素
C
参数(MAXNVIN=101,MAXNVOUT=200)
C
C *** 将错误指标设置为零
C
IERR1=0
IERR2=0
C
C *** 获取输入值的数量
C
NVIN=AIN(1)
C *** IF NUMBER 超出最大预期集错误并返回
如果(NVIN.GT.MAXNVIN)那么
IERR1=1
IERR2=1
返回
ENDIF
C
C *** 设置输出值的数量
C
NVOUT=2*NVIN
C *** IF NUMBER 超出最大预期集错误并返回
IF(NVOUT .GT.MAXNVOUT) 那么
IERR1=1
IERR2=2
返回
ENDIF
C
C *** 初始化 AOUT 索引
C
JOUT=0
C
C *** 为每个输入值计算两个输出值
C
DO I=1,NVIN
JOUT=JOUT+1
AOUT(JOUT)=2.*AIN(I+1)
JOUT=JOUT+1
AOUT(JOUT)=3.*AIN(I+1)
结束
返回


将其编译为 dll 并从另一个 Fortran 程序调用此 dll
成功了,所以这告诉我 dll 没问题.

这就是我尝试从 python 2.4 调用它的方式

导入调用dll
handle = calldll.load_library(''c:/sample_dll.dll'')
addr = calldll.get_proc_address(handle, ''SAMPLE'')
#到目前为止一切顺利,我得到了句柄和地址
e1 = 0
e2 = 0
ain = [2, 3, 4]
aout = [ ]
calldll.call_foreign_function(addr, ''hhll'', ''l'',(e1, e2,ain,aout))
Traceback(最近一次通话最后一次):
文件"<交互式输入>",第 1 行,在 ?
TypeError: 需要一个整数

有人用 Pyfort、F2Py 或 calldll 提供过类似的例子吗?

提前致谢.


Mangabasi 写道:
有没有人用 Pyfort、F2Py 或 calldll 提供类似的例子?
使用 numpy 中的最新 f2py:


本文地址:https://www.itbaoku.cn/post/1050484.html