1

I'm following this tutorial on Embedding Python on C, but their Pure Embedding example is not working for me.

I have on the same folder (taken from the example):

call.c

#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;
}

multiply.py

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

And I compile and run like this:

$ gcc $(python-config --cflags) call.c $(python-config --ldflags) -o call
call.c: In function ‘main’:
call.c:6:33: warning: unused variable ‘pDict’ [-Wunused-variable]
     PyObject *pName, *pModule, *pDict, *pFunc;
                                 ^
# This seems OK because it's true that pDict is not used

$ ./call multiply multiply 3 2
ImportError: No module named multiply
Failed to load "multiply"

Why can't it load multiply module? Example doesn't show filenames nor paths. Can it be a path problem?

Thanks a lot.

2
  • Can you import that module from the interactive interpreter? python -c 'import multiply'? If you have python3 installed then you are probably getting a SyntaxError when trying to import that module. Commented Apr 22, 2014 at 14:05
  • If I'm on same folder as multiply.py, yes. Commented Apr 22, 2014 at 14:07

2 Answers 2

4

Try setting PYTHONPATH:

export PYTHONPATH=`pwd`
Sign up to request clarification or add additional context in comments.

1 Comment

Note that this will break if you change directory. You can launch the program as: PYTHONPATH=. ./call multiply multiply 3 2 and the call program will receive the redefined PYTHONPATH variable in its environment.
0

Really, the example should have PySys_SetPath("."); after initialization.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.