|
1 #include <Python.h> |
|
2 |
|
3 int |
|
4 main(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 = 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 } |