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