我正在使用一个名为 Mitsuba 的软件。它带有一个 Python 实现,用 Boost 包装。 Python 中的这一行:
scene = SceneHandler.loadScene(fileResolver.resolve("model.xml"), paramMap)
产生错误。根据文档,fileResolver.resolve的类型是fs::path,paramMap的类型是ParameterMap。
C++ 代码中的函数签名是:
SceneHandler::loadScene(const fs::path &filename, const ParameterMap ¶ms)
错误是:
Traceback (most recent call last):
File "...\foo.py", line 22, in <module>
scene = SceneHandler.loadScene(fileResolver.resolve("model.xml"), paramMap)
ArgumentError: Python argument types in
SceneHandler.loadScene(str, StringMap)
did not match C++ signature:
loadScene(class boost::filesystem2::basic_path<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct boost::filesystem2::path_traits>, class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct mitsuba::SimpleStringOrdering,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >)
我可以做哪些进一步的调查?您知道问题出在哪里吗?
最佳答案
不幸的是,不清楚是哪个参数导致了问题。
根据您的错误消息,fileResolver.resolve
的返回类型显然是 str
,而不是 boost::filesystem::basic_path
。您要查看的是 Mitsuba 定义其 Boost.Python 接口(interface)的位置,以查看是否注册了一个“转换器”,用于将 Python 字符串转换为 boost::fs::path
对象。如果没有,您将不得不弄清楚为该库获取可转换为正确类型的 Python 对象的正确方法是什么。
对于第二个参数,您需要进行基本相同的检查,除非 StringMap
已经是一个 Boost.Python 类型(type(paramMap.__class__)
返回什么?)。看起来 ParameterMap
是一个 typedef for
`std::map<std::string, std::string, mitsuba::SimpleStringOrdering>`
但同样,必须有一个 Boost.Python 转换器已注册,可以从 Python 类型进行转换。
关于c++ - 使用由 Boost : did not match C++ signature 生成的 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10901173/