我正在尝试包装 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()
(返回值是一个空字符串)。