c++ - Python C API PyObject_Repr Segmentation fault (core dumped) -


i'm trying use scikit learn in c++ project. here code i'm using:

    #include <python.h>     pyobject* loadmodule(char* name)//     {         pyobject* pname = pystring_fromstring(name);         pyobject* pmodule = pyimport_import(pname);         py_decref(pname);         return pmodule;     }     void displaypyobject(pyobject* object)     {      pyobject* objectsrepresentation = pyobject_repr(object);     pyerr_print();     const char* s = pystring_asstring(objectsrepresentation);     pyerr_print();     std::cout << "[ pyobject ]" << s << std::endl;      }     //load functions/ attributes module     pyobject* loadcomponentfrommodule(char* module, char* component)      {        pyobject* pmodule = loadmodule(module);        pyobject* pycomponent = pyobject_getattrstring(pmodule, component);        py_decref(pmodule);        return pycomponent;     }      //wrapper kmeans clustering scikit-learn class kmeans { public:     kmeans(int nclusters)     {          pyobject* kmeansclass = loadcomponentfrommodule("sklearn.cluster", "kmeans");         pyobject* pname2 = pyint_fromlong((long) nclusters);         pyobject* pargs = pytuple_new(1);         pytuple_setitem(pargs, 0, pname2);         _kcluster = pyobject_callobject(kmeansclass, pargs);         _closestor = loadcomponentfrommodule("sklearn.metrics","pairwise_distances_argmin_min");         py_decref(kmeansclass);         py_decref(pname2);         py_decref(pargs);     }     ~kmeans()     {         py_decref(_kcluster);        py_decref(_closestor);     }      void setnumclusters(int nclusters)     {         std::cout << "change number cluster: " << nclusters << "\n";         pyobject* ncluster = pyint_fromlong((long) nclusters);         int code = pyobject_setattrstring(_kcluster,"n_clusters", ncluster);         pyerr_print();         if (code == -1)         {             std::cout << "[error] kmeans.setnumclusters() failed!! - number of clusters didn't change!!\n";         }         py_decref(ncluster);     }         void info()     {         displaypyobject(_kcluster);     }  private:     pyobject* _kcluster;     //pyobject* _result;     pyobject* _closestor; };  pyobject* loadclassifier() {     pyobject* loader = loadcomponentfrommodule("sklearn.externals.joblib", "load");     pyobject* pname2 = pystring_fromstring("lda.pkl");     pyobject* pargs = pytuple_new(1);     pytuple_setitem(pargs, 0, pname2);     pyobject* clf = pyobject_callobject(loader, pargs);     py_decref(loader);     py_decref(pname2);     py_decref(pargs); //    displaypyobject(clf);     return clf; }  void produce_error() {     std::cout << "============================= line 0 =========================================\n";     pyobject* clf = loadclassifier();//"sklearn.externals.joblib", "load");     std::cout << "============================= line 1 =========================================\n";     kmeans cluster(8);     std::cout << "============================= line 2 =========================================\n";     cluster.setnumclusters(5);     std::cout << "============================= line 3 =========================================\n";     cluster.info();     std::cout << "============================= line 4 =========================================\n";  }  int main(int argc, char *argv[]) {     py_initialize();     produce_error();     py_finalize();     return 0; } 

every time run program, error:

============================= line 0 ========================================= ============================= line 1 ========================================= segmentation fault (core dumped) 

as far understand, without calling classifier, don't error whenever call (loadclassifier()) , create instance of kmeans, error showed up. sometime error inside constructor of kmeans load module, same code in function (which isn't here), error inside pyobject_repr() (inside displaypyobject()).

anyone same problem before? know how solve it? in advance.

problem solved. figured out. answer here future if needs. becareful when use py_decref(). problem comes line inside constructor of kmeans:

py_decref(pname2);

because when run py_decref(pargs); try free pname2 freed. create unpredictable behavior. after commented line, everythings run ok.


Comments