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
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);
}
}
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.