85 lines
2.6 KiB
C++
85 lines
2.6 KiB
C++
#include <Python.h>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
class Test {
|
|
public:
|
|
Test() = default;
|
|
~Test()
|
|
{
|
|
Py_DECREF(test);
|
|
Py_DECREF(object);
|
|
}
|
|
void create()
|
|
{
|
|
test = Py_BuildValue("s", "Hello World from a method in Embedded Python!!!");
|
|
std::cout << "test " << test->ob_refcnt << std::endl;
|
|
std::string moduleName = "sklearn.svm.SVC";
|
|
PyObject* pyModuleName = PyUnicode_FromString(moduleName.c_str());
|
|
std::cout << "py_module_name " << pyModuleName->ob_refcnt << std::endl;
|
|
object = PyImport_AddModuleObject(pyModuleName);
|
|
if (PyErr_Occurred()) {
|
|
std::cerr << "Couldn't import module " + moduleName;
|
|
Py_XDECREF(test);
|
|
Py_XDECREF(object);
|
|
Py_XDECREF(pyModuleName);
|
|
exit(1);
|
|
}
|
|
std::cout << "module " << object->ob_refcnt << std::endl;
|
|
Py_XDECREF(pyModuleName);
|
|
}
|
|
PyObject* test;
|
|
PyObject* object;
|
|
|
|
};
|
|
|
|
void print(PyObject* object, std::string name)
|
|
{
|
|
std::cout << name << " " << object->ob_refcnt << std::endl;
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
Py_Initialize();
|
|
std::string moduleName = "sklearn.svm";
|
|
std::cout << "1a" << std::endl;
|
|
PyObject* module = PyImport_ImportModule(moduleName.c_str());
|
|
if (PyErr_Occurred()) {
|
|
std::cerr << "Couldn't import module " << moduleName;
|
|
exit(1);
|
|
}
|
|
print(module, "module");
|
|
std::cout << "1b" << std::endl;
|
|
std::string className = "SVC";
|
|
PyObject* classObject = PyObject_GetAttrString(module, className.c_str());
|
|
if (PyErr_Occurred()) {
|
|
std::cerr << "Couldn't find class " << className;
|
|
exit(1);
|
|
}
|
|
print(classObject, "classObject");
|
|
std::cout << "1c" << std::endl;
|
|
PyObject* instance = PyObject_CallObject(classObject, NULL);
|
|
if (PyErr_Occurred()) {
|
|
std::cerr << "Couldn't create instance of class " << className;
|
|
exit(1);
|
|
}
|
|
print(instance, "instance");
|
|
std::cout << std::string(40, '-') << std::endl;
|
|
print(module, "module");
|
|
print(classObject, "classObject");
|
|
print(instance, "instance");
|
|
std::cout << "decref instance" << std::endl;
|
|
Py_DECREF(instance);
|
|
std::cout << "decref classobject" << std::endl;
|
|
Py_DECREF(classObject);
|
|
std::cout << "decref module" << std::endl;
|
|
Py_DECREF(module);
|
|
std::cout << std::string(40, '-') << std::endl;
|
|
print(module, "after decref module");
|
|
print(classObject, "after decref classObject");
|
|
print(instance, "after decref instance");
|
|
std::cout << "**call finalize" << std::endl;
|
|
Py_Finalize();
|
|
std::cout << "**after finalize" << std::endl;
|
|
return 0;
|
|
} |