From 854e71168960439ed10d6ac057725dbe42f95929 Mon Sep 17 00:00:00 2001 From: reinelt Date: Tue, 3 May 2005 11:13:24 +0000 Subject: [lcd4linux @ 2005-05-03 11:13:23 by reinelt] rearranged autoconf a bit, libX11 will be linked only if really needed (i.e. when the X11 driver has been selected) plugin_python filled with life git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@537 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- plugin_python.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 98 insertions(+), 12 deletions(-) (limited to 'plugin_python.c') diff --git a/plugin_python.c b/plugin_python.c index 88e60e8..7b61096 100644 --- a/plugin_python.c +++ b/plugin_python.c @@ -1,8 +1,8 @@ -/* $Id: plugin_python.c,v 1.1 2005/05/02 10:29:20 reinelt Exp $ +/* $Id: plugin_python.c,v 1.2 2005/05/03 11:13:24 reinelt Exp $ * * Python plugin * - * Copyright 2005 Fixme! + * Copyright 2005 Dan Fritz * Copyright 2005 The LCD4Linux Team * * This file is part of LCD4Linux. @@ -23,6 +23,11 @@ * * * $Log: plugin_python.c,v $ + * Revision 1.2 2005/05/03 11:13:24 reinelt + * rearranged autoconf a bit, + * libX11 will be linked only if really needed (i.e. when the X11 driver has been selected) + * plugin_python filled with life + * * Revision 1.1 2005/05/02 10:29:20 reinelt * preparations for python bindings and python plugin * @@ -36,6 +41,7 @@ * */ +#include #include "config.h" @@ -46,25 +52,105 @@ #include "plugin.h" #include "hash.h" -// Fixme: #include "lcd4linux_wrap.h" +/* + * Executes a python function specified by function name and module. + * + * This method is more or less a copy of an example found in the python + * documentation. Kudos goes to Guido van Rossum and Fred L. Drake. + * + * Returns a char* directly from PyString_AsString() !!! DO NOT DEALLOCATE !!! + */ +static const char* +pyt_exec_str(const char* module, const char* function, int argc, const char* argv[]) { + + PyObject *pName, *pModule, *pDict, *pFunc; + PyObject *pArgs, *pValue; + const char * rv = NULL; + int i; -static void my_exec (RESULT *result, RESULT *arg1) -{ -#if 0 - const char* value = pyt_exec_str(R2S(arg1)); -#else - const char *value = "Fixme"; -#endif + pName = PyString_FromString(module); + /* Error checking of pName left out */ + + pModule = PyImport_Import(pName); + Py_DECREF(pName); + + if (pModule != NULL) { + pDict = PyModule_GetDict(pModule); + /* pDict is a borrowed reference */ + + pFunc = PyDict_GetItemString(pDict, function); + /* pFun: Borrowed reference */ + + if (pFunc && PyCallable_Check(pFunc)) { + pArgs = PyTuple_New(argc); + for (i = 0; i < argc; ++i) { + pValue = PyString_FromString(argv[i]); + if (!pValue) { + Py_DECREF(pArgs); + Py_DECREF(pModule); + fprintf(stderr, "Cannot convert argument %s\n", argv[i]); + return NULL; + } + /* pValue reference stolen here: */ + PyTuple_SetItem(pArgs, i, pValue); + } + pValue = PyObject_CallObject(pFunc, pArgs); + Py_DECREF(pArgs); + if (pValue != NULL) { + rv = PyString_AsString(pValue); + //printf("Result of call: %s\n", rv); + Py_DECREF(pValue); + return rv; + } + else { + Py_DECREF(pModule); + PyErr_Print(); + fprintf(stderr,"Call failed\n"); + return NULL; + } + /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ + } + else { + if (PyErr_Occurred()) + 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 NULL; + } + return NULL; +} + +static int python_cleanup_responsibility = 0; + +static void my_exec (RESULT *result, RESULT *module, RESULT *function, RESULT *arg ) +{ + const char* args[] = {R2S(arg)}; + const char* value = pyt_exec_str(R2S(module),R2S(function),1,args); SetResult(&result, R_STRING, value); } int plugin_init_python (void) { - AddFunction ("python::exec", 1, my_exec); + if (!Py_IsInitialized()) { + Py_Initialize(); + python_cleanup_responsibility = 1; + } + AddFunction ("python::exec", 3, my_exec); return 0; } void plugin_exit_python (void) { - /* empty */ + /* Make sure NOT to call Py_Finalize() When (and if) the entire lcd4linux process + * is started from inside python + */ + if (python_cleanup_responsibility) { + python_cleanup_responsibility = 0; + Py_Finalize(); + } } -- cgit v1.2.3