0

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

4

0 回答 0