/* ----------------------------------------------------------------------- Copyright: 2010-2021, imec Vision Lab, University of Antwerp 2014-2021, CWI, Amsterdam Contact: astra@astra-toolbox.com Website: http://www.astra-toolbox.com/ This file is part of the ASTRA Toolbox. The ASTRA Toolbox is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The ASTRA Toolbox is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the ASTRA Toolbox. If not, see . ----------------------------------------------------------------------- */ #ifdef ASTRA_PYTHON #include "PythonPluginAlgorithm.h" #include "astra/Logging.h" #include "astra/Utilities.h" #include #include #include #include #include "bytesobject.h" namespace astra { void logPythonError(){ if(PyErr_Occurred()){ PyObject *ptype, *pvalue, *ptraceback; PyErr_Fetch(&ptype, &pvalue, &ptraceback); PyErr_NormalizeException(&ptype, &pvalue, &ptraceback); PyObject *traceback = PyImport_ImportModule("traceback"); if(traceback!=NULL){ PyObject *exc; if(ptraceback==NULL){ exc = PyObject_CallMethod(traceback,"format_exception_only","OO",ptype, pvalue); }else{ exc = PyObject_CallMethod(traceback,"format_exception","OOO",ptype, pvalue, ptraceback); } if(exc!=NULL){ PyObject *six = PyImport_ImportModule("six"); if(six!=NULL){ PyObject *iter = PyObject_GetIter(exc); if(iter!=NULL){ PyObject *line; std::string errStr = ""; while(line = PyIter_Next(iter)){ PyObject *retb = PyObject_CallMethod(six,"b","O",line); if(retb!=NULL){ errStr += std::string(PyBytes_AsString(retb)); Py_DECREF(retb); } Py_DECREF(line); } ASTRA_ERROR("%s",errStr.c_str()); Py_DECREF(iter); } Py_DECREF(six); } Py_DECREF(exc); } Py_DECREF(traceback); } if(ptype!=NULL) Py_DECREF(ptype); if(pvalue!=NULL) Py_DECREF(pvalue); if(ptraceback!=NULL) Py_DECREF(ptraceback); } } CPluginAlgorithm::CPluginAlgorithm(PyObject* pyclass){ instance = PyObject_CallObject(pyclass, NULL); if(instance==NULL) logPythonError(); } CPluginAlgorithm::~CPluginAlgorithm(){ if(instance!=NULL){ Py_DECREF(instance); instance = NULL; } } bool CPluginAlgorithm::initialize(const Config& _cfg){ if(instance==NULL) return false; PyObject *cfgDict = XMLNode2dict(_cfg.self); PyObject *retVal = PyObject_CallMethod(instance, "astra_init", "O",cfgDict); Py_DECREF(cfgDict); if(retVal==NULL){ logPythonError(); return false; } m_bIsInitialized = true; Py_DECREF(retVal); return m_bIsInitialized; } void CPluginAlgorithm::run(int _iNrIterations){ if(instance==NULL) return; PyGILState_STATE state = PyGILState_Ensure(); PyObject *retVal = PyObject_CallMethod(instance, "run", "i",_iNrIterations); if(retVal==NULL){ logPythonError(); }else{ Py_DECREF(retVal); } PyGILState_Release(state); } PyObject *CPluginAlgorithm::getInstance() const { if (instance) Py_INCREF(instance); return instance; } #if PY_MAJOR_VERSION >= 3 PyObject * pyStringFromString(std::string str){ return PyUnicode_FromString(str.c_str()); } #else PyObject * pyStringFromString(std::string str){ return PyBytes_FromString(str.c_str()); } #endif PyObject* stringToPythonValue(std::string str){ if(str.find(";")!=std::string::npos){ std::vector rows, row; StringUtil::splitString(rows, str, ";"); PyObject *mat = PyList_New(rows.size()); for(unsigned int i=0; i vec; StringUtil::splitString(vec, str, ","); PyObject *veclist = PyList_New(vec.size()); for(unsigned int i=0;i nodes = node.getNodes(); std::list::iterator it = nodes.begin(); while(it!=nodes.end()){ XMLNode subnode = *it; if(subnode.getName()=="Option"){ PyObject *obj; if(subnode.hasAttribute("value")){ obj = stringToPythonValue(subnode.getAttribute("value")); }else{ obj = stringToPythonValue(subnode.getContent()); } PyDict_SetItemString(opts, subnode.getAttribute("key").c_str(), obj); Py_DECREF(obj); }else{ PyObject *obj = stringToPythonValue(subnode.getContent()); PyDict_SetItemString(dct, subnode.getName().c_str(), obj); Py_DECREF(obj); } ++it; } PyDict_SetItemString(dct, "options", opts); Py_DECREF(opts); return dct; } } #endif