Problem mit Python-Funktion in embedded Anwendung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
enrico
User
Beiträge: 7
Registriert: Montag 30. Januar 2006, 17:00

Dienstag 1. Mai 2007, 11:27

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.
Antworten