2013年1月4日 星期五

python + ctypes

最近遇到 mixed language 的問題, 除了考慮到 code 的可讀性之外, 還有安全性, 效能方面...的問題. 考慮了 swig, ctypes, boost.python, cython...來實現. 發現用 ctypes 比較簡單, 也不需額外在安裝. 而且是 standard lib. 底下就用個簡單的 sample 來實現.


wrapper DLL lib func call dpi.cc
#ifdef __cplusplus
extern "C" {

int
DPIAdd(int a, int b) {
    return a+b;
}

}
#endif



gcc command
gcc -c -fPIC dpi.cc -o dpi.o
gcc -shared -o dpi.so dpi.o


use python ctypes to call dpi
import sys
from ctypes import *

class DPIWrapper:
    """
    wrapper class for DPI example
    """

    def __init__(self, name="dpi.so"):
 """
 name : shared library path
 """
     self._dl = None
 try:
    self._dl = cdll.LoadLibrary(name)
 except IOError:
     print "load %s fail" %(name)

    def __del__(self):
     self._dl = None

    def WrapperAdd(self, a, b):
 """
 wrapper add func from dpi.so
 """
 return self._dl.DPIAdd(a,b)


def main():
    dpi = DPIWrapper(name="dpi.so")
    print "%d" %(dpi.WrapperAdd(1,2))
    del dpi

if __name__ == "__main__":
    main()


Ref: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
http://blog.ez2learn.com/2009/03/21/python-evolution-ctypes/
http://stackoverflow.com/questions/5081875/ctypes-beginner

沒有留言:

張貼留言