#include #include #define error(msg) do { printf("%s\n", msg); exit(1); } while (1) main() { /* run objects with low-level calls and full error checking */ char *arg1="sir", *arg2="robin", *cstr; PyObject *pmod, *pclass, *pargs, *pinst, *pmeth, *pres; /* instance = module.klass() */ Py_Initialize(); pmod = PyImport_ImportModule("module"); /* fetch module */ if (pmod == NULL) error("Can't load module"); pclass = PyObject_GetAttrString(pmod, "klass"); /* fetch module.class */ Py_DECREF(pmod); if (pclass == NULL) error("Can't get module.klass"); pargs = Py_BuildValue("()"); if (pargs == NULL) { Py_DECREF(pclass); error("Can't build arguments list"); } pinst = PyEval_CallObject(pclass, pargs); /* call class() */ Py_DECREF(pclass); Py_DECREF(pargs); if (pinst == NULL) error("Error calling module.klass()"); /* result = instance.method(x,y) */ pmeth = PyObject_GetAttrString(pinst, "method"); /* fetch bound method */ Py_DECREF(pinst); if (pmeth == NULL) error("Can't fetch klass.method"); pargs = Py_BuildValue("(ss)", arg1, arg2); /* convert to Python */ if (pargs == NULL) { Py_DECREF(pmeth); error("Can't build arguments list"); } pres = PyEval_CallObject(pmeth, pargs); /* call method(x,y) */ Py_DECREF(pmeth); Py_DECREF(pargs); if (pres == NULL) error("Error calling klass.method"); if (!PyArg_Parse(pres, "s", &cstr)) /* convert to C */ error("Can't convert klass.method result"); printf("%s\n", cstr); Py_DECREF(pres); }