2012-03-28 68 views
0

我有一個非常基本的問題。我有一些舊的FORTRAN77代碼,並且我在Windows中通過f2py來編譯它。當我用Python調用它時,返回值是0.0而不是正確的。從Python調用Fortran .pyd文件並返回0.0返回

以下是編譯

FUNCTION ttt (APPRAT, METRAT) 

    REAL APPRAT, METRAT  

    IF(APPRAT.LE.0.0)THEN 
    ttt = METRAT * 0.89218 
    ELSE 
    ttt = APPRAT 
    ENDIF 
    RETURN 
    END 

這裏之前我正確 Fortran代碼(測試)是Python代碼

import al4 #the name of compiled FORTRAN 77 code which is a .pyd file 
ff=(al4.ttt(-1,10)) 
print(ff) 

如果一切正常,我應該得到8.9218作爲返回值,但我總是得到0.0。所以任何人都可以給我一些建議?提前致謝!!

+0

我不知道任何有關Fortran或Fortran <-> Python界面,但是它可能與您正在進行浮點算術時-1和10是整數有關嗎? – 2012-03-28 17:19:35

+1

還是因爲你正在分配'APPRAT'而不是'ttt'? – 2012-03-28 17:21:48

+0

@EmilVikström感謝您的評論。我嘗試將兩個浮點值提供給FORTRAN代碼,但我仍然得到0.0。但你是對的,FORTRAN確實返回了ttt而不是APPRAT。感謝您的幫助! – 2012-03-28 17:34:10

回答

1

這裏有一個小東西,我砍死在一起看f2py文檔:

c This is file al4.f 

     FUNCTION ttt (APPRAT, METRAT) 
     IMPLICIT NONE 
     REAL APPRAT, METRAT,ttt 
cf2py intent(in), APPRAT,METRAT 
cf2py intent(out) ttt  

     IF(APPRAT.LE.0.0)THEN 
     ttt = METRAT * 0.89218 
     ELSE 
     ttt = APPRAT 
     ENDIF 
     RETURN 
     END 

我那麼「編譯」它:f2py -c al4.f -m al4 然後跑到上面的Python腳本(同一目錄AL4。所以 - 雖然擴展名「.so」可能會因您的系統而異),並且工作正常。 cf2py是特別註釋(fortran註釋在第一列中有c),它告訴f2py如何處理參數。在這種情況下,你有2個輸入和1個輸出...

編輯我應該練什麼,我說,在評論...(添加隱NONE的功能)

+0

謝謝!如果Fortran支持「RETURN ttt」這樣的事情會更容易 – 2012-03-29 04:35:38

+1

問題不在這裏不是Fortran。事實上,在Fortran程序中,您可以按照您期望的結果調用您的函數'result = ttt(v1,v2)'。問題在於f2py如何決定爲你的函數創建一個包裝器......在這種情況下,我們似乎需要明確告訴f2py它應該如何處理這些參數。 – mgilson 2012-03-29 11:12:12

+0

感謝您的信息! – 2012-03-29 14:05:26