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