python调用fortran 交互,从Python调用Fortran

Howdy,

I have been trying to call the following Fortran function from Python

(using Windows XP, Compaq Fortran and Python 2.4). I tried F2Py,

Pyfort and calldll with no success.

I think I came very close with calldll. Here is a short summary

Fortran code:

SUBROUTINE SAMPLE(IERR1,IERR2,AIN,AOUT)

C

C SIMPLE SAMPLE OF A DLL

C

!DEC$ATTRIBUTES DLLEXPORT :: SAMPLE

!DEC$ATTRIBUTES ALIAS:''SAMPLE'' :: SAMPLE

INTEGER,INTENT(OUT) :: IERR1,IERR2

REAL*8,INTENT(IN) :: AIN(*)

REAL*8,INTENT(OUT) :: AOUT(*)

C

C *** SET MAXIMUM EXPECTED ELEMENTS OF ARRAY AIN AND AOUT

C

PARAMETER (MAXNVIN=101,MAXNVOUT=200)

C

C *** SET ERROR INDICATORS TO ZERO

C

IERR1=0

IERR2=0

C

C *** GET NUMBER OF INPUT VALUES

C

NVIN=AIN(1)

C *** IF NUMBER EXCEEDS MAXIMUM EXPECTED SET ERRORS AND RETURN

IF(NVIN .GT. MAXNVIN) THEN

IERR1=1

IERR2=1

RETURN

ENDIF

C

C *** SET NUMBER OF OUTPUT VALUES

C

NVOUT=2*NVIN

C *** IF NUMBER EXCEEDS MAXIMUM EXPECTED SET ERRORS AND RETURN

IF(NVOUT .GT. MAXNVOUT) THEN

IERR1=1

IERR2=2

RETURN

ENDIF

C

C *** INITIALIZE AOUT INDEX

C

JOUT=0

C

C *** COMPUTE TWO OUTPUT VALUES FOR EACH INPUT VALUE

C

DO I=1,NVIN

JOUT=JOUT+1

AOUT(JOUT)=2.*AIN(I+1)

JOUT=JOUT+1

AOUT(JOUT)=3.*AIN(I+1)

END DO

RETURN

END

compiled it to a dll and called this dll from another Fortran program

with success, so this tells me that dll is OK.

This is how I tried to call it from python 2.4

import calldll

handle = calldll.load_library(''c:/sample_dll.dll'')

addr = calldll.get_proc_address(handle, ''SAMPLE'')

#so far so good, I got a handle and address

e1 = 0

e2 = 0

ain = [2, 3, 4]

aout = [ ]

calldll.call_foreign_function(addr, ''hhll'', ''l'',(e1, e2,ain,aout))

Traceback (most recent call last):

File "", line 1, in ?

TypeError: an integer is required

Has anyone provide a similar example with Pyfort, F2Py or calldll?

Thanks in advance.

解决方案ATTRIBUTES DLLEXPORT :: SAMPLE

!DEC

ATTRIBUTES ALIAS:''SAMPLE'' :: SAMPLE

INTEGER,INTENT(OUT) :: IERR1,IERR2

REAL*8,INTENT(IN) :: AIN(*)

REAL*8,INTENT(OUT) :: AOUT(*)

C

C *** SET MAXIMUM EXPECTED ELEMENTS OF ARRAY AIN AND AOUT

C

PARAMETER (MAXNVIN=101,MAXNVOUT=200)

C

C *** SET ERROR INDICATORS TO ZERO

C

IERR1=0

IERR2=0

C

C *** GET NUMBER OF INPUT VALUES

C

NVIN=AIN(1)

C *** IF NUMBER EXCEEDS MAXIMUM EXPECTED SET ERRORS AND RETURN

IF(NVIN .GT. MAXNVIN) THEN

IERR1=1

IERR2=1

RETURN

ENDIF

C

C *** SET NUMBER OF OUTPUT VALUES

C

NVOUT=2*NVIN

C *** IF NUMBER EXCEEDS MAXIMUM EXPECTED SET ERRORS AND RETURN

IF(NVOUT .GT. MAXNVOUT) THEN

IERR1=1

IERR2=2

RETURN

ENDIF

C

C *** INITIALIZE AOUT INDEX

C

JOUT=0

C

C *** COMPUTE TWO OUTPUT VALUES FOR EACH INPUT VALUE

C

DO I=1,NVIN

JOUT=JOUT+1

AOUT(JOUT)=2.*AIN(I+1)

JOUT=JOUT+1

AOUT(JOUT)=3.*AIN(I+1)

END DO

RETURN

END

compiled it to a dll and called this dll from another Fortran program

with success, so this tells me that dll is OK.

This is how I tried to call it from python 2.4

import calldll

handle = calldll.load_library(''c:/sample_dll.dll'')

addr = calldll.get_proc_address(handle, ''SAMPLE'')

#so far so good, I got a handle and address

e1 = 0

e2 = 0

ain = [2, 3, 4]

aout = [ ]

calldll.call_foreign_function(addr, ''hhll'', ''l'',(e1, e2,ain,aout))

Traceback (most recent call last):

File "", line 1, in ?

TypeError: an integer is required

Has anyone provide a similar example with Pyfort, F2Py or calldll?

Thanks in advance.

Mangabasi wrote:

Has anyone provide a similar example with Pyfort, F2Py or calldll?

With the latest f2py in numpy:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值