Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C/Python API not executing a function

Tags:

c++

python

c

Hello stack overflow this is my first question. I have spend the majority of my day trying to fix this problem but cant. I need to implement Python into my C projects and the Python doc used this piece of code to display calling python functions in C but when i execute it with these the runtime arguments it displays this error .

ImportError: No module named multiply.py
Failed to load multiply.py 

here is my C code (which is exactly the same as the doc):

#include <Python.h>

int  main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
int i;

if (argc < 3) {
    fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
    return 1;
}

Py_Initialize();
pName = PyString_FromString(argv[1]);
/* Error checking of pName left out */

pModule = PyImport_Import(pName);
Py_DECREF(pName);

if (pModule != NULL) {
    pFunc = PyObject_GetAttrString(pModule, argv[2]);
    /* pFunc is a new reference */

    if (pFunc && PyCallable_Check(pFunc)) {
        pArgs = PyTuple_New(argc - 3);
        for (i = 0; i < argc - 3; ++i) {
            pValue = PyInt_FromLong(atoi(argv[i + 3]));
            if (!pValue) {
                Py_DECREF(pArgs);
                Py_DECREF(pModule);
                fprintf(stderr, "Cannot convert argument\n");
                return 1;
            }
            /* pValue reference stolen here: */
            PyTuple_SetItem(pArgs, i, pValue);
        }
        pValue = PyObject_CallObject(pFunc, pArgs);
        Py_DECREF(pArgs);
        if (pValue != NULL) {
            printf("Result of call: %ld\n", PyInt_AsLong(pValue));
            Py_DECREF(pValue);
        }
        else {
            Py_DECREF(pFunc);
            Py_DECREF(pModule);
            PyErr_Print();
            fprintf(stderr,"Call failed\n");
            return 1;
        }
    }
    else {
        if (PyErr_Occurred())
            PyErr_Print();
        fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
    }
    Py_XDECREF(pFunc);
    Py_DECREF(pModule);
}
else {
    PyErr_Print();
    fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
    return 1;
}
Py_Finalize();
return 0;

}

here is my Python code:

def multiply(a,b):
    print "Will compute", a, "times", b
    c = 0
    for i in range(0, a):
        c = c + b
    return c

here is my compiler tags:

 gcc  -I/usr/include/python2.7/ -lpython2.7  Code.c -o Code

and here is the arguments i am passing:

./Code.out multiply.pl multiply 3 2

I think this is a nice amount of information please give me some help/

UPDATE: answer found! you need add this code :

PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));
like image 382
Evan Clark Avatar asked Feb 27 '26 03:02

Evan Clark


1 Answers

The current directory is not added to sys.path when the interpreter is embedded in a C program; you will need to add it manually if you want it checked for modules.

like image 121
Ignacio Vazquez-Abrams Avatar answered Mar 01 '26 16:03

Ignacio Vazquez-Abrams