1 #include <Python.h>
2 
3 int
main(int argc,char * argv[])4 main(int argc, char *argv[])
5 {
6     PyObject *pName, *pModule, *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 = PyString_FromString(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 = PyInt_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", PyInt_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     Py_Finalize();
67     return 0;
68 }
69