diff options
author | Fred Drake <fdrake@acm.org> | 2001-08-04 01:58:36 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-08-04 01:58:36 (GMT) |
commit | 53765753c4b1ede0fd25eadde52e235c62b1c8b7 (patch) | |
tree | 9db81df661e7af0f27819dbc8d7d69f5238b8cf4 /Doc/ext/run-func.c | |
parent | b3cc29b4934ed39cbd5237d58f6a26c8e591a166 (diff) | |
download | cpython-53765753c4b1ede0fd25eadde52e235c62b1c8b7.zip cpython-53765753c4b1ede0fd25eadde52e235c62b1c8b7.tar.gz cpython-53765753c4b1ede0fd25eadde52e235c62b1c8b7.tar.bz2 |
Lots of new text and example code on embedding Python in C, contributed
by Albert Hofkamp. Some editing has been done for style and markup
consistency.
This also supplies an example of importing modules and calling a function
defined in the module, so this closes SF bug #440037 as well.
(The long example code was moved to a separate file so that it would
format properly.)
Diffstat (limited to 'Doc/ext/run-func.c')
-rw-r--r-- | Doc/ext/run-func.c | 66 |
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; +} |