c++pythonembedded-language

Passing arguments in Python function via C++


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).


Solution

  • 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();