2

I am trying to make a call to a python module function from my cpp file.

The call i have made is as follows:

#include <iostream>
#include "Python.h"

int
main(int argc, char** argv)
{
    Py_Initialize();
    PyObject *pName = PyString_FromString("tmpPyth");
    PyObject *pModule = PyImport_Import(pName);
    std::cout<< "Works fine till here";
    PyObject *pDict = PyModule_GetDict(pModule);
    if (pModule != NULL) {
        PyObject *pFunc = PyObject_GetAttrString(pDict, "pyFunc");

        if(pFunc != NULL){
            PyObject_CallObject(pFunc, NULL);
        }
    }
    else
        std::cout << "Python Module not found";
    return 0;
}

My python module is defined as follows:

import numpy
import scipy
import matplotlib

from scipy import stats
def blah():
        baseline = [9.74219, 10.2226, 8.7469, 8.69791, 9.96442, 9.96472, 9.37913, 9.75004]
        follow_up = [9.94227,9.46763,8.53081,9.43679,9.97695,10.4285,10.159,8.86134]
        paired_sample  = stats.ttest_rel(baseline , follow_up )
        print "The t-statistic is %.3f and the p-value is %.3f." % paired_sample

The code in the cpp file runs fine till the 1st "std::cout" but then ends up giving me a "seg fault". Running the python code separately works fine and gives the desired output.

I cant figure out what is going wrong. Any help will be appreciated. (Note the program is compiling correctly and running correctly till the 1st "cout")

2
  • I can tell you that it is segfaulting because of PyObject *pDict = PyModule_GetDict(pModule);. Seems like its not able to load the module at all. Commented May 7, 2015 at 0:56
  • So ideally that line should be in the if block after you have made sure that the module got loaded. Commented May 7, 2015 at 1:17

1 Answer 1

5

So there are a couple of things that you were not doing right. See the comments inline. Assuming that both your CPP file and Python file lives at the following path: /home/shanil/project.

test.cpp:

#include <iostream>
#include "Python.h"

int
main(int argc, char** argv)
{
    Py_Initialize();

    // First set in path where to find your custom python module.
    // You have to tell the path otherwise the next line will try to load
    // your module from the path where Python's system modules/packages are
    // found.
    PyObject* sysPath = PySys_GetObject("path");
    PyList_Append(sysPath, PyString_FromString("/home/shanil/project"));

    // Load the module
    PyObject *pName = PyString_FromString("my_mod");
    PyObject *pModule = PyImport_Import(pName);

    // Random use-less check
    std::cout<< "Works fine till here\n";

    if (pModule != NULL) {
        std::cout << "Python module found\n";

        // Load all module level attributes as a dictionary
        PyObject *pDict = PyModule_GetDict(pModule);

        // Remember that you are loading the module as a dictionary, the lookup you were
        // doing on pDict would fail as you were trying to find something as an attribute
        // which existed as a key in the dictionary
        PyObject *pFunc = PyDict_GetItem(pDict, PyString_FromString("my_func"));

        if(pFunc != NULL){
            PyObject_CallObject(pFunc, NULL);
        } else {
            std::cout << "Couldn't find func\n";
        }
    }
    else
        std::cout << "Python Module not found\n";
    return 0;
}

my_mod.py:

def my_func():
    print 'got called'
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.