Python C API PyObject_Repr分段错误(已转储内核)
Python C API PyObject_Repr Segmentation fault (core dumped)
我正试图在我的C++项目中使用scikit-learn。这是我正在使用的代码:
#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 from module
PyObject* loadComponentFromModule(char* module, char* component)
{
PyObject* pModule = loadModule(module);
PyObject* pyComponent = PyObject_GetAttrString(pModule, component);
Py_DECREF(pModule);
return pyComponent;
}
//WRAPPER FOR KMEANS CLUSTERING FROM 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 to 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;
}
每次我运行这个程序时,我都会得到错误:
============================= LINE 0 =========================================
============================= LINE 1 =========================================
Segmentation fault (core dumped)
据我所知,在不调用分类器的情况下,我不会得到任何错误,但每当我调用它(loadClassifier())并创建KMean实例时,错误就会显示出来。有时错误在KMean的构造函数中,我在其中加载模块,在另一个函数中使用相同的代码(不在这里),错误在PyObject_Repr()中(在displayPyObject()中)。
以前有人遇到过同样的问题吗?你知道怎么解决吗?提前谢谢。
问题已解决。我想明白了。因此,如果有人需要,请在这里回答未来的问题。当您使用Py_DECREF()时会非常有用。问题来自KMeans构造函数中的这一行:
Py_DECREF(pName2);
因为当您运行Py_DECREF(pArgs);它将尝试释放已经被释放的pName2。它将产生一种不可预测的行为。在评论了那行之后,一切都很好。
相关文章:
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 正在处理故障(堆芯转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 分段错误(内核转储) C++面向对象编程
- 有关矩阵的代码错误导致分段错误(内核转储)
- 内存集分段故障内核转储
- 使用较大的升压矩阵时出现分段错误(内核转储)
- Python C API PyObject_Repr分段错误(已转储内核)