Changeset: 03935b788de4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=03935b788de4 Modified Files: monetdb5/extras/pyapi/pyapi.c Branch: pyapi Log Message:
Python API: user code running diffs (53 lines): diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c --- a/monetdb5/extras/pyapi/pyapi.c +++ b/monetdb5/extras/pyapi/pyapi.c @@ -243,7 +243,7 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st } if (snprintf(pycall, pycalllen, - "def pyfun(%s):\n%s", + "import numpy\ndef pyfun(%s):\n%s", argnames, expr_ind) >= (int) pycalllen) { msg = createException(MAL, "pyapi.eval", "Command too large"); goto wrapup; @@ -256,16 +256,28 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st { int pyret; PyObject *pFunc, *pModule; + pModule = PyImport_Import(PyString_FromString("__main__")); pyret = PyRun_SimpleString(pycall); pFunc = PyObject_GetAttrString(pModule, "pyfun"); if (pyret != 0 || !pModule || !pFunc || !PyCallable_Check(pFunc)) { msg = createException(MAL, "pyapi.eval", "could not parse Python code %s", pycall); + goto wrapup; + } + + pResult = PyObject_CallObject(pFunc, pArgs); + if (PyErr_Occurred()) { + PyObject *pErrType, *pErrVal, *pErrTb; + PyErr_Fetch(&pErrType, &pErrVal, &pErrTb); + if (pErrVal) { + msg = createException(MAL, "pyapi.eval", "Python exception: %s", PyString_AS_STRING(PyObject_Str(pErrVal))); + } else { + msg = createException(MAL, "pyapi.eval", "Python exception: ?"); + } goto wrapup; // shudder } - pResult = PyObject_CallObject(pFunc, pArgs); if (!pResult || !PyList_Check(pResult) || PyList_Size(pResult) != pci->retc) { msg = createException(MAL, "pyapi.eval", "Invalid result object. Need list of size %d containing numpy arrays", pci->retc); goto wrapup; @@ -335,10 +347,8 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st str PyAPIprelude(void *ret) { (void) ret; MT_lock_init(&pyapiLock, "pyapi_lock"); - if (PyAPIEnabled()) { MT_lock_set(&pyapiLock, "pyapi.evaluate"); - /* startup internal Python environment */ if (!pyapiInitialized) { char* iar = NULL; Py_Initialize(); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list