RE: swig or ctypes , under the gun and need help

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sells, Fred

    RE: swig or ctypes , under the gun and need help

    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.valu e = mds
    sRehabType = 'mcare'
    sModel = '34'

    results = libc.RugCalc(sM dsRecord, sRehabType, sModel, iQuarterlyFlag,
    ZeroCmi,
    byref(sRugHier) ,
    byref(sRugMax),
    byref(iRugHier) ,
    byref(iRugMax),
    byref(nCmiValue Hier),
    byref(nCmiValue Max),
    byref(iAdlSum),
    byref(iCpsCode) ,
    byref(sRugsVers ion),
    byref(sDllVersi on),
    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.t xt')
    for d in datafile:
    if d[0]=='B':
    getrug(d)
    break


  • Diez B. Roggisch

    #2
    Re: swig or ctypes , under the gun and need help

    Sells, Fred schrieb:
    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
    You need to create a proper library. The above doesn't do that - it
    creates as simple object file.

    I don't know how to really do that without using autoconf/automake.

    Diez

    Comment

    • norseman

      #3
      Re: swig or ctypes , under the gun and need help

      Diez B. Roggisch wrote:
      Sells, Fred schrieb:
      >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
      >
      You need to create a proper library. The above doesn't do that - it
      creates as simple object file.
      >
      I don't know how to really do that without using autoconf/automake.
      >
      Diez
      --

      >
      ==
      see info gcc
      search shared (3.13 Options for Linking)

      mkso.scr:
      #!/bin/bash
      # create a lib.so from param 1 filename
      #
      #vi $1
      f=`basename $1 .c`
      gcc -c -fPIC $f
      ld -shared -fPIC $f.o -o $f.so
      # end of file


      I suppose $1 could be `cat *.c`
      Haven't tried that, but.... Who knows?
      (I write my libs to be libs.)

      Steve
      norseman@hughes .net

      Comment

      Working...