Skip to content Skip to sidebar Skip to footer

Can't Redirect Error Stream From Cython

The SFML library that I'm trying to cythonize defines this function below that allows to change where errors are printed to (by default SFML writes error messages to the console wh

Solution 1:

There are two ingredients for your problem and both are in your setup-file.

The first ingredient is that you have two extensions:

ext_modules = [
    Extension('nebula.sfml.system', ['nebula/sfml/system.pyx'],
              language='c++', ...),
    Extension('nebula.sfml.graphics', ['nebula/sfml/graphics.pyx'],
              language='c++', ...),
] 

that means cython will create two different shared libraries: system.dll and graphics.dll which will be both loaded later on dynamically by python.

The second ingredient: the sfml-library is linked statically but contains a singleton (the error-stream in question) and this is a recipe for disaster: With your set-up it is no longer a singleton, but there are two different error-streams: The one from system.dll and the one from graphics.dll. So you are silencing the error-stream from the system.dll (because your call set_error_handler() lives there), but write to the error-stream from the graphics.dll (this where image_load_test lives).

So what can be done? There are two options:

  1. Use shared sfml-libraries (at least sfml-system-s), thus the singleton will stay a singleton.
  2. Put the content of both pyx-files in the same pyx-file/Extension/shared library. At least right now, the content of system.pyx is only needed for graphics.pyx.

Post a Comment for "Can't Redirect Error Stream From Cython"