Python Can';t从Cython重定向错误流

Python Can';t从Cython重定向错误流,python,cython,sfml,iostream,cythonize,Python,Cython,Sfml,Iostream,Cythonize,我正在尝试cythonize的SFML库在下面定义了此函数,它允许更改错误打印到的位置(默认情况下,未调用此函数时,SFML将错误消息写入控制台): 我的上述函数的简化.pxd文件: cdef extern from 'SFML/System.hpp' namespace 'sf': ostream& cerr 'sf::err' () 和my.pyx模块,该模块编译并运行良好,但不会重定向错误消息(它们仍然打印到控制台) 我使用MSVC,静态连接C++代码。 编辑 下面是SF

我正在尝试cythonize的SFML库在下面定义了此函数,它允许更改错误打印到的位置(默认情况下,未调用此函数时,SFML将错误消息写入控制台):

我的上述函数的简化.pxd文件:

cdef extern from 'SFML/System.hpp' namespace 'sf':
    ostream& cerr 'sf::err' ()
和my.pyx模块,该模块编译并运行良好,但不会重定向错误消息(它们仍然打印到控制台)

我使用MSVC,静态连接C++代码。 编辑

下面是SFML库如何在自己的代码()中记录错误的示例:

。。。
//错误,无法加载映像

err()您的问题有两个因素,它们都在安装文件中

第一个要素是您有两个扩展:

ext_modules = [
    Extension('nebula.sfml.system', ['nebula/sfml/system.pyx'],
              language='c++', ...),
    Extension('nebula.sfml.graphics', ['nebula/sfml/graphics.pyx'],
              language='c++', ...),
] 
这意味着cython将创建两个不同的共享库:
system.dll
graphics.dll
,这两个库稍后将由python动态加载

第二个要素:sfml库是静态链接的,但包含一个单例(有问题的错误流),这是一个灾难的原因:在您的设置中,它不再是单例,但有两个不同的错误流:一个来自
system.dll
,另一个来自
graphics.dll
。因此,您正在使
system.dll
中的错误流静音(因为您的调用
set\u error\u handler()
存在于此),但从
graphics.dll
写入错误流(此处
image\u load\u test
存在)

那么我们能做些什么呢?有两种选择:

  • 使用共享的
    sfml
    -库(至少
    sfml-system-s
    ),这样单例将保持单例
  • 将两个pyx文件的内容放在同一个pyx文件/扩展名/共享库中。至少现在,
    system.pyx
    的内容仅适用于
    graphics.pyx

  • 你能提供一个最小的pyx文件,在那里你可以使用日志吗?@ead当然,我已经更新了这个问题。我没有记录任何代码到S> SF:错误()//>代码,SFML库执行此操作,我想抑制或重定向。如果在C++中编写“代码> SETYErrOrthHORLLER())/Cuff>,并调用Cython,会发生什么。这样行吗?只是试图排除,这不是一个SFML问题。@ EAD我可以确认纯C++代码(没有Cython)成功地抑制或重定向错误缓冲区。但我更希望避免编写C++,只希望纯Cython能起作用。
    cdef void set_error_handler():
        cerr().rdbuf(NULL)  # This call should prevent errors appearing in the console but it silently fails
    
    set_error_handler()
    
    ...
    // Error, failed to load the image
    err() << "Failed to load image \"" << filename << "\". Reason: " << stbi_failure_reason() << std::endl;
    ...
    
    ext_modules = [
        Extension('nebula.sfml.system', ['nebula/sfml/system.pyx'],
                  language='c++', ...),
        Extension('nebula.sfml.graphics', ['nebula/sfml/graphics.pyx'],
                  language='c++', ...),
    ]