swig or ctypes , under the gun and need help

Sells, Fred fred.sells at adventistcare.org
Mon Aug 25 14:23:18 EDT 2008


Diez wrote...
> I don't know swig, but if all you have is a real C-API, try & 
> use ctypes.
> It's much easier to create bindings for, keeps you fully in 
> the warm and
> cozy womb of python programming and doesn't need no 
> compilation to create
> the actual binding.
> 
You're right the ctypes does seem more pythonesque; however I'm still stuck trying return all these parameters
that the c api uses.  my ctypes code is below.  It just quits running when I try to print 
one of the args I did a pass byref on, no error out, nothing.  admittedly I'm a newbie to ctypes and not much of a c programmer
but I could sure use some help.  my ctypes test code follows...

from ctypes import *

'''
create shared object file like so.
gcc -shared -o rug520.so  rug520.c

the c api I want to call is like this.
int RugCalc( char * sMdsRecord, 
             char * sRehabType, 
             char * sModel, 
             int iQuarterlyFlag, 
             double nCmiArray[], 
              char * sRugHier,
             char * sRugMax, 
             int * iRugHier,
             int * iRugMax, 
             double * nCmiValueHier,
             double * nCmiValueMax, 
             int * iAdlSum,
             int * iCpsCode, 
             char * sRugsVersion,
             char * sDllVersion, 
             int * iError );
'''
libc = CDLL("rug520.so")

CmiArrayDef = c_double * 59

ZeroCmi = CmiArrayDef( )  #this is a table used internally, but 0.0 should work until I figure out the rest.



def getrug(mds):
    #print mds
    sMdsRecord = c_char_p()
    sRehabType = c_char_p()
    sModel = c_char_p()
    iQuarterlyFlag = c_int()
    sRugHier  = c_char_p()
    sRugMax = c_char_p()
    iRugHier = c_int()
    iRugMax = c_int()
    nCmiValueHier = c_double()
    nCmiValueMax  = c_double()
    iAdlSum = c_int()
    iCpsCode = c_int()
    sRugsVersion = c_char_p()
    sDllVersion = c_char_p()
    iError = c_int()    
    sMdsRecord.value = mds
    sRehabType = 'mcare'
    sModel = '34'

    results = libc.RugCalc(sMdsRecord, sRehabType, sModel, iQuarterlyFlag, 
                             ZeroCmi,
                             byref(sRugHier),
                             byref(sRugMax), 
                             byref(iRugHier),
                             byref(iRugMax), 
                             byref(nCmiValueHier),
                             byref(nCmiValueMax), 
                             byref(iAdlSum),
                             byref(iCpsCode), 
                             byref(sRugsVersion),
                             byref(sDllVersion), 
                             byref(iError ))
    print 'results', results
    print iQuarterlyFlag.value
    print 'sRugMax', sRugMax  #this print causes an exit, tried .value with same results
    print 'return'  #I never see this print.

datafile = open('mdsdata.txt')
for d in datafile:
    if d[0]=='B':
        getrug(d)
        break

 



More information about the Python-list mailing list