| #include <Python.h> |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| PyObject *pName, *pModule, *pDict, *pFunc; |
| PyObject *pArgs, *pValue; |
| int i, result; |
| |
| if (argc < 3) { |
| fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); |
| return 1; |
| } |
| |
| Py_Initialize(); |
| pName = PyString_FromString(argv[1]); |
| /* Error checking of pName left out */ |
| |
| pModule = PyImport_Import(pName); |
| if (pModule != NULL) { |
| pDict = PyModule_GetDict(pModule); |
| /* pDict is a borrowed reference */ |
| |
| pFunc = PyDict_GetItemString(pDict, argv[2]); |
| /* pFun: Borrowed reference */ |
| |
| if (pFunc && PyCallable_Check(pFunc)) { |
| pArgs = PyTuple_New(argc - 3); |
| for (i = 0; i < argc - 3; ++i) { |
| pValue = PyInt_FromLong(atoi(argv[i + 3])); |
| if (!pValue) { |
| fprintf(stderr, "Cannot convert argument\n"); |
| return 1; |
| } |
| /* pValue reference stolen here: */ |
| PyTuple_SetItem(pArgs, i, pValue); |
| } |
| pValue = PyObject_CallObject(pFunc, pArgs); |
| if (pValue != NULL) { |
| printf("Result of call: %ld\n", PyInt_AsLong(pValue)); |
| Py_DECREF(pValue); |
| } |
| else { |
| PyErr_Print(); |
| fprintf(stderr,"Call failed\n"); |
| return 1; |
| } |
| Py_DECREF(pArgs); |
| /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ |
| } |
| else { |
| PyErr_Print(); |
| fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); |
| } |
| Py_DECREF(pModule); |
| } |
| else { |
| PyErr_Print(); |
| fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); |
| return 1; |
| } |
| Py_DECREF(pName); |
| Py_Finalize(); |
| return 0; |
| } |