f2py call-back and newbie questions
Hello, I apologize for this long listing, but I have a lot of pent-up f2py queries occupying my mind [?] I realize that f2py is a non-commercial service to the community, and am highly impressed that it exists at all. I can only offer in return my own assistance to others (say via this list), after I have crossed some of these bridges and can in turn assist others who venture in. I am new to this list, as well as Python and am trying to use the f2py call-back feature . I am embarking upon a rather large Fortran->Python (80,000 line code) conversion for a dynamics simulation system ( http://home.comcast.net/~GTOSS/), and will be willing to share all knowledge of how this goes. I am converting code by evolving from 100% F90 -> xxx % Python starting at the "results-data-base/post-processing/interpretive-manipulation" side of the existing code. So far, I can successfully create a wrap that allows me to call a Fortran program from Python, but can't successfully do the reverse call-back scheme. I think I have located just about every documentation available, including numerous versions of some, but I have questions that I can't seem to resolve through this documentation. At the end of this request is shown the actual code (it is very simple). My system...... Ubuntu 8.0.4; GNU C++/g95 Compiler (current release) Python 2.5.2; Numpy 1.0.4; f2py 2.4422 The Problem..... The symptom is: Depending upon how I invoke f2py to create the wrap, one of 2 failures occur: 1. At Python execution, Python insists that my arguments to the Fortran subroutine (CBSET) are incorrect (I use 2, it insists on 1), OR, 2. Python accepts my 2 arguments to the Fortran subroutine, and when I execute Python, I end up getting a segmentation fault when I attempt to make the call-back from Fortran. This would normally tell me that likely I have some kind of argument issue (although the call-back routine defn itself has NO arguments...although the "external" attribute routine name does appear as an argument in the subroutine at the INSISTENCE of the g95 compiler). General questions (maybe related to the problem, maybe not).... 1. I never get a "makefile" created by running f2py. Why? 2. I never get a module document (ie. "__xxx__") created by running f2py (although I do get the ".pyf" sig-file). Why? 3. Is the Python "call-back" program code supposed to reside in the Python program that originally makes the Python -> Fortran wrap-connection (I assumed it is)? 4. Does the "XXXX.so" file need to be linked into the Fortran code via a "makefile" operation to successfully "call-back"? 5. Where can I find some simple, but illustrative examples of using f2py to "wrap a Fortran 90 data Class-definition"? I need to understand how the f2py calls would look, and what is manifest with in the Python code to actually lay hands on the elements of the Fortran "derived data types". In general, it would be nice to find a detailed example of: a python program, a corresponding consistent Fortran program that combines to demonstrate the call-back scheme (and that one can type in, and will actually function correctly), and the preferred (ie. correct?) f2py statements that need to be executed to accomplish this (I would be glad to contribute same to the body of knowledge, if I can ever get it to work). I will be most grateful for comments on any or all of this. thanks Dave Lang The Fortran Code: ! PROGAM TO DEMONSTRATE GTOSS FORTRAN -> PYTHON CONNECTION SUBROUTINE CBSET( N, call_back ) !f2py intent(in) N INTEGER N !f2py intent(callback) call_back EXTERNAL call_back ! IDENTIFY THAT FORTRAN IS EXECUTING & IDENTIFY WHY CBSET IS CALLED PRINT *,'Enter CBSET.F, N=', N IF(N .EQ. 1) THEN PRINT *,' in CBSET: this Call originated to test call-back' PRINT *,' in CBSET: Make callback to PYTHON...EXPECT reply' CALL call_back() PRINT *,' in CBSET: Returned from call-back to PYTHON' END IF IF(N .EQ. 2) THEN PRINT *,' in CBSET: Call came from Python to test Py->For' END IF RETURN END *The Python Program:* import os import foo def main(): print 'Hello, pymain is about to call CBSET to test f2py operation' #satisfy arg list for cbset ????? dummy=call_back #test "Python --> Fortran" (nominal wrap) from Python n = 2 foo.cbset(n, dummy) #test "Fortran --> Python" (call-back) scheme as seen from Python n = 1 foo.cbset(n, dummy) # define call-back routine def call_back(): print '...Confirming...."call_back"is entered from CBSET call' # end of call-back defn if __name__ =='__main__': main() NOTE: depending upon how f2py is invoked to create the wrap, a disagreement can be experienced between Python and Fortran as to "how many args the F90 program 'CBSET' really exhibits"; in one case, Python aborts at execution, insisting that "CBSET has exactly 1 argument", The other type event is that Python is happy with the code as shown, but Fortran gets a runtime "Segmentation fault" when the "call_back" is executed. BTW, at compile, Fortran is NEVER happy UNLESS the EXTERNAL routine named "call_back" actually appears as an arg in the CBSET subroutine definition.
participants (2)
-
Dave Lang
-
David Froger