I have moved the freeimage error handler callback function to the module
namespace to prevent it being garbage collected. See the following for
more info on this quirk of ctypes:
http://stackoverflow.com/questions/12995925/how-to-prevent-functype-from-being-collectedhttps://github.com/JohannesBuchner/PyMultiNest/issues/5
This also changes the way FreeImage errors are handled. If an exception
is raised in a callback, it will not propagate beyond ctypes internals.
Now, we use a callback that sets a global variable to indicate error. We
then check for error and reset the error string to NULL every time the
C api is called. This is the only way we can both:
a) Not segfault on freeimage error
b) Pass the freeimage error to the user
c) raise RuntimeError()
The plugin loader tries plugins but only catches ImportError and
RuntimeError. The FreeImage plugin was throwing OSError. Tests
were failing when FreeImage was not installed. It now throws a
RuntimeError.