Python Can';t从Cython重定向错误流
我正在尝试cythonize的SFML库在下面定义了此函数,它允许更改错误打印到的位置(默认情况下,未调用此函数时,SFML将错误消息写入控制台): 我的上述函数的简化.pxd文件: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
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++', ...),
]