I am using a C++ program and I need to call Python objects from the C++ program (to perform optimization and mathematical operations). I am having trouble to pass arguments to Python object via C++ Here is a simple code
#include <Python.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
int main()
{
PyObject *pName, *pModule, *pDict, *pClass, *pInstance;
// Initialize the Python interpreter
Py_Initialize();
// Build the name object
pName = PyString_FromString("Adder");
// Load the module object
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
pDict = PyModule_GetDict(pModule);
// Build the name of a callable class
pClass = PyDict_GetItemString(pDict, "Adder");
// Create an instance of the class
if (PyCallable_Check(pClass))
{
pInstance = PyObject_CallObject(pClass,NULL);
}
else
{
std::cout << "Cannot instantiate the Python class" << std::endl;
}
int sum = 0;
int x;
for (size_t i = 0 ; i < 5 ; i++)
{
x = rand() % 100;
sum += x;
PyObject_CallMethod(pInstance, "add","(i)",x);
}
PyObject_CallMethod(pInstance, "printSum", NULL);
std::cout << "the sum via C++ is " << sum << std::endl;
std::getchar();
Py_Finalize();
}
and the python class
class Adder:
# Constructor
def __init__(self):
self.sum = 0
# Add an element to the Adder
def add(self,x):
print "adding via python ", x
self.sum += x
# Print the total sum
def printSum(self):
print "the sum via the Python class is ",self.sum
Unfortunately, the argument x does not go through the python method add (when i call PyObject_CallMethod(pInstance, "add","i",x)) Calling the print method via python gives me "the sum via the Python class is 0". What is the best way to provide a number to a python method ?
Thanks a lot for your help
Vincent
PS : I defined a double add function in python as
def add2(self,x,y):
print "double adding via python"
self.sum += x*y
Calling the following in C++
PyObject_CallMethod(pInstance, "add2","(ii)",x,2);
is working... It seems that I have a problem with the format (i).
According to the docs of PyObject_CallMethod
, the format string should produce a tuple. Also, don't ignore the return value. Try
PyObject *pValue;
pValue = PyObject_CallMethod(pInstance, "add","(i)",x);
if (pValue)
Py_DECREF(pValue);
else
PyErr_Print();