I don't know swig, but if all you have is a real C-API, try &You're right the ctypes does seem more pythonesque; however I'm still stuck trying return all these parameters
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.
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