Seite 1 von 1

Problem mit Python-Funktion in embedded Anwendung

Verfasst: Dienstag 1. Mai 2007, 11:27
von enrico
Hallo,

ich habe Python (2.4) in unsere Anwendung integriert. Normalerweise rufe ich nur Funktionen der Anwendung aus Python auf, manchmal brauch ich jedoch Werte aus Python in der Anwendung. Dazu hab ich mir eine Python-Funktion geschrieben:

Code: Alles auswählen

def getConsoleValue(name):
  """Utility function for C-code to fetch values from the console."""
  print "Name: " + name
  result = consoleInstance.GetValue()
  print "Result: " + result
  return result
Und C-Funktionen zum Abrufen von Werten:

Code: Alles auswählen

static PyObject *GetFunctionFromModule(const std::string &moduleName, const std::string &functionName)
{
        PyObject *pyModuleName = PyString_FromString(moduleName.c_str());
        PyObject *module = PyImport_Import(pyModuleName);
        if(!module)
                S2::Severe("Failed to import %s-module!", moduleName.c_str());
        Py_XDECREF(pyModuleName);

        PyObject *moduleDict = PyModule_GetDict(module);
        PyObject *function = PyDict_GetItemString(moduleDict, functionName.c_str());
        if(!function)
                S2::Severe("Failed to import %s.%s!",moduleName.c_str(), functionName.c_str());

        return function;
}
static PyObject *GetObjectFromConsole(const std::string &objectName)
{
        static PyObject *function = NULL;
        if(!function)
        {
                function = GetFunctionFromModule("scripts.S2.console", "getConsoleValue");
        }

        PyObject *argument = PyTuple_New(1);
        PyTuple_SetItem(argument, 0, PyString_FromString(objectName.c_str()));
        PyObject *result = PyObject_CallObject(function, argument);

        Py_XDECREF(argument);

        return result;
}
void GetIntegerFromConsole(const std::string &objectName, Uint &result)
{
    PyObject *object = GetObjectFromConsole(objectName);
    if(!object)
    {
         S2::Warning("%s not found: %s", __FUNCTION__, objectName.c_str());
         result = 0;
    }
    else
    {
         std::string str = PyString_AsString(object);
         result = atoi(str.c_str());
         S2::Info("%s: %s = %i", __FUNCTION__, objectName.c_str(), result);
         Py_XDECREF(object);
    }
}
Also, der Code hat ja mal funktioniert.
Vor ein paar Tagen ist mir dann aufgefallen, dass die letzte Funktion nur noch 0 zurückgibt. Nach einiger Untersuchung stellte sich dann heraus, dass von getConsoleValue() jeweils nur das erste Statement ausgeführt wird. Das zweite print oben seh ich gar nicht erst. Auch wenn ich in der zweiten Zeile eine Exception werfe, wird diese nicht reportet. Werfe ich selbige jedoch in der ersten Zeile, wird sie anständig von der Runtime bearbeitet.

Hat jemand schonmal ähnliches Verhalten beobachtet? Was kann ich dagegen machen?

Danke, Enrico

Edit (Leonidas): Code-Highlighting eingeschaltet.