Calling python from a C function that is embedded in python?

Greg Ewing (using news.cis.dfn.de) ckea25d02 at sneakemail.com
Tue Apr 8 07:18:55 CEST 2003


Greg Ewing (using news.cis.dfn.de) wrote:
 > VanL wrote:
 >> I want python to be able to call wrapped functions like
 >> they are python functions, and a wrapped C library to call wrapped
 >> python functions like they were in C.
 >
 > I have a demo showing how to do it with Pyrex, but I don't have it
 > here right now.

Well, I found the demo. It shows how you can pass a
Python function to a C library as a callback.

cheesefinder.h:
-------------------------------------------------------
typedef void (*user_func)(char *name, void *user_data);
void find_cheeses(user_func f, void *user_data);
-------------------------------------------------------

cheesefinder.c:
-------------------------------------------------------
#include "cheesefinder.h"

static char *cheese_list[] = {
   "cheddar",
   "camembert",
   "that runny one",
};

void find_cheeses(user_func f, void *user_data) {
   char **p = cheese_list;
   while (*p) {
     f(*p, user_data);
     ++p;
   }
}
-------------------------------------------------------

cheese.pyx:
-------------------------------------------------------
cdef extern from "cheesefinder.h":
   ctypedef void (*user_func)(char *name, void *user_data)
   void find_cheeses(user_func f, void *user_data)

def find(f):
   find_cheeses(callback, <void*>f)

cdef void callback(char *name, void *f):
   (<object>f)(name)
-------------------------------------------------------

run_cheese.py:
-------------------------------------------------------
import cheese

def report_cheese(name):
   print "Found cheese:", name

cheese.find(report_cheese)
-------------------------------------------------------

-- 
Greg Ewing, Computer Science Dept,
University of Canterbury,	
Christchurch, New Zealand
http://www.cosc.canterbury.ac.nz/~greg





More information about the Python-list mailing list