summaryrefslogtreecommitdiffstats
path: root/Doc/ext/run-func.c
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/ext/run-func.c')
-rw-r--r--Doc/ext/run-func.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/Doc/ext/run-func.c b/Doc/ext/run-func.c
new file mode 100644
index 0000000..fb2a9ae
--- /dev/null
+++ b/Doc/ext/run-func.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#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;
+}