2013-11-14 33 views
7

我不能讓f2py在一個單獨的子程序中用來定義輸入數組維度的模塊中引用一個參數。即該放慢參數是defeind模塊中:F2PY - 子程序中的訪問模塊參數

! File: testmod.f90 
MODULE testmod 
INTEGER, PARAMETER :: dimsize = 20 
END MODULE testmod 

和dimsize需要在另一個文件中的子程序(不包含在模塊中)中引用的參數,這將是我的Python模塊的入口點:

! File testsub.f90 
SUBROUTINE testsub(arg) 
USE testmod 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

我這樣進行編譯:

f2py -m testmod -h testmod.pyf testsub.f90 
pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o 
pgf90 -g -Mbounds -Mchkptr -c -fPIC testsub.f90 -o testsub.o 
f2py -c testmod.pyf testmod.o testsub.o 

,但得到這個錯誤:

testmodmodule.c: In function 'f2py_rout_testmod_testsub': 
testmodmodule.c:180: error: 'dimsize' undeclared (first use in this function) 

我試圖修改testsub.g90包括以下指令,如建議妮其他職位:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, parameter :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

,但無濟於事。我需要保持子程序與模塊分離。

如何獲得f2py正確解析變量dimsize

TIA

+0

我在使用f2py版本2時在Windows 7上遇到了'ifort'的問題。這個問題似乎發生在_first_ f2py調用中,我看到錯誤: 'In::testmoddd:testsub.f90: testsub get_useparameters:no testmod使用的testub信息 In::testmoddd:testsub.f90:testsub getarrlen:變量「dimsize」undefined「 – bdforbes

+0

@bdforbes:嗯......我開始認爲這只是一個嚴重的問題使用Fortran90時f2py的缺點。我應該堅持F77! – ccbunney

回答

1

雖然我沒有測試它,我覺得幾乎與原來的代碼有它。我們爲我們的一些代碼做了類似的事情,但使用gfortran。

您應該不需要f2py testmod.f90文件。你應該把它編譯成目標文件就像你,如果這是正常的Fortran:

pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o 

那麼你應該能夠編譯testsub.f90成蟒蛇可用模塊:

f2py --fcompiler=pgf90 --f90flags="-g -Mbounds -Mchkptr" -c testsub.f90 -m testsub testmod.o 

這應該建立一個testsub.so或等效的,讓你import testsub然後testsub.testsub(my_arg) python。

+0

感謝您的回覆,但不幸的是,我得到了同樣的錯誤... – ccbunney

+0

嗯,你有沒有嘗試過用不同的編譯器?我只用過fforty的gfortran ... – cm2

+1

我用--fcompiler = gfortran再試了一遍,但是我得到了同樣的錯誤。它本質上是產生錯誤的C編譯器,而不是Fortran編譯器。我認爲,f2py根本不處理好F90模塊... – ccbunney

2

這個問題已經很長時間了,但我找到了問題,所以我想我會將它發佈給有此問題的任何其他人。問題是,雖然Fortran代碼是完全有效的,但由F2PY生成的C封裝器在檢查數組是否正確(在C封裝器中,封裝在某種模塊結構中)時不知道dimsize是什麼。

就在這個代碼改變:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, parameter :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

這樣:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, intent(aux) :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

這將 「定義在F2PY生成的包裝功能的輔助C變量」。正如Scipy docs所說,這是「對保​​存參數值有用,以便可以在其他變量的初始化表達式中訪問它們」。

我還沒有用你的代碼測試過這個,但是我測試過它和我有類似的情況。

+0

不錯!在維度使用* same *模塊中定義的參數的子例程中聲明數組時,我也遇到了這個問題,並且這個問題解決了這個問題。 –

相關問題