A quick-start memento for cytpes. Used on vanila Debian 6.0.7 (squeeze), python 2.7.3
(instruction on how to install second python on Debian: https://gist.github.com/ftao/1069219)
C
hello.c
#include<stdio.h>
hello() {
printf("Hello World\n");
}
compile:
$ gcc -c hello.c -o hello.o
link in shared library:
g++ -shared -Wl,-soname,hello.so -o hello.so hello.o
helloWrapper.py:
from ctypes import cdll
lib = cdll.LoadLibrary('./hello.so')
def hello():
lib.hello()
run python:
$ python >>> import helloWrapper >>> helloWrapper.hello() Hello World
C++
Taken from: http://stackoverflow.com/a/145649/236195
foo.cpp
#include <iostream>
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
compile into a shared library:
g++ -c -fPIC foo.cpp -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
fooWrapper.py:
from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
run python:
$ python >>> import fooWrapper >>> f = fooWrapper.Foo() >>> f.bar() Hello
Great success!