1#include <Python.h>
2
3int
4main(int argc, char *argv[])
5{
6    PyObject *pName, *pModule, *pDict, *pFunc;
7    PyObject *pArgs, *pValue;
8    int i;
9
10    if (argc < 3) {
11        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
12        return 1;
13    }
14
15    Py_Initialize();
16    pName = PyUnicode_DecodeFSDefault(argv[1]);
17    /* Error checking of pName left out */
18
19    pModule = PyImport_Import(pName);
20    Py_DECREF(pName);
21
22    if (pModule != NULL) {
23        pFunc = PyObject_GetAttrString(pModule, argv[2]);
24        /* pFunc is a new reference */
25
26        if (pFunc && PyCallable_Check(pFunc)) {
27            pArgs = PyTuple_New(argc - 3);
28            for (i = 0; i < argc - 3; ++i) {
29                pValue = PyLong_FromLong(atoi(argv[i + 3]));
30                if (!pValue) {
31                    Py_DECREF(pArgs);
32                    Py_DECREF(pModule);
33                    fprintf(stderr, "Cannot convert argument\n");
34                    return 1;
35                }
36                /* pValue reference stolen here: */
37                PyTuple_SetItem(pArgs, i, pValue);
38            }
39            pValue = PyObject_CallObject(pFunc, pArgs);
40            Py_DECREF(pArgs);
41            if (pValue != NULL) {
42                printf("Result of call: %ld\n", PyLong_AsLong(pValue));
43                Py_DECREF(pValue);
44            }
45            else {
46                Py_DECREF(pFunc);
47                Py_DECREF(pModule);
48                PyErr_Print();
49                fprintf(stderr,"Call failed\n");
50                return 1;
51            }
52        }
53        else {
54            if (PyErr_Occurred())
55                PyErr_Print();
56            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
57        }
58        Py_XDECREF(pFunc);
59        Py_DECREF(pModule);
60    }
61    else {
62        PyErr_Print();
63        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
64        return 1;
65    }
66    if (Py_FinalizeEx() < 0) {
67        return 120;
68    }
69    return 0;
70}
71