Я пытаюсь обернуть поток ошибок SFML, чтобы получить последнее сообщение об ошибке в пространство Python.
Вот как SFML объявляет поток ошибок (увидеть источник):
namespace sf {
std::ostream& err();
}
SFML говорит, что вы можете перенаправить вышеуказанный поток в ваш буфер (в примере в файл, но я хочу преобразовать его в строку в конце концов):
// Redirect to a file
std::ofstream file("sfml-log.txt");
std::streambuf* previous = sf::err().rdbuf(file.rdbuf());
Мой файл .pxd с некоторыми упрощенными обертками:
cdef extern from '<sstream>' namespace 'std' nogil:
cppclass stringbuf:
stringbuf() except +
cdef extern from '<iostream>' namespace 'std' nogil:
cppclass ostream:
stringbuf* rdbuf(stringbuf*)
cdef extern from 'SFML/System.hpp' namespace 'sf' nogil:
ostream cerr 'sf::err'
И мой модуль .pyx:
cdef void set_error_handler(stringbuf& buffer):
cerr.rdbuf(&buffer)
cdef object get_last_error():
error = error_buffer.str()
error_buffer.str('')
return error
cdef stringbuf error_buffer
set_error_handler(error_buffer)
Также я конвертирую stringbuf
с сообщением об ошибке в строку Python правильно в get_last_error()
функционировать?
Мне удалось скомпилировать мой код Cython. Я добавил здесь круглые скобки:
cdef extern from 'SFML/System.hpp' namespace 'sf' nogil:
ostream cerr 'sf::err()' # Added ()
Но все же я не могу получить сообщение об ошибке, о которой сообщает SFML, в моем stringbuf error_buffer
при звонке get_last_error()
определено выше (возвращаемое значение — пустая строка).
Задача ещё не решена.
Других решений пока нет …