2

I've been trying to run a Python 3 script through C using code the documentation provided.

main.c:

#include <stdio.h>
#include <stdlib.h>
#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 = PyUnicode_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 = PyLong_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", PyLong_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;
}

test.py:

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

I enter into the console:

./pytest test multiply 3 4

and I get:

AttributeError: 'module' object has no attribute 'multiply'
Cannot find function "multiply"

I'm using Ubuntu 13.10; I figured this was relevant because the documentation appeared to be addressing Windows. What am I missing?

1 Answer 1

2

You've forgotten (or rather, were never told) that the current/script/executable directory is not added to sys.path when embedding the interpreter, so you've found some completely different module called "test" and are importing that instead.

Sign up to request clarification or add additional context in comments.

6 Comments

Thanks a bunch I'll keep this in mind in the future. Since I still have your attention, I've renamed the file to "qwe.py" and now I get ImportError: No module named 'qwe' Failed to load "qwe"
Never mind I'm headed towards the right direction now. Thanks again.
@user1610810: The problem isn't that it found some other module instead of yours, it's that it isn't capable of finding yours in the first place.
I figured that. I tried making it reachable using PySys_SetPath(PyBytes_FromString("/home/frosty/NetBeansProjects/pyTest/")); , but no luck. Is there documentation I can just dive into?
@user1610810: No, there is none. You can manipulate sys.path as you would any other list though.
|

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.