使用使用 Boost 生成的 Python 模块:与C++签名不匹配

Using a Python module generated with Boost: did not match C++ signature

本文关键字:C++ 不匹配 Python Boost 模块      更新时间:2023-10-16

我正在使用一个名为Mitsuba的软件。它附带了一个Python实现,用Boost包装。Python中的这一行:

scene = SceneHandler.loadScene(fileResolver.resolve("model.xml"), paramMap)

产生错误。根据文档,fileResolver.resolve 的类型是 fs::p ath,paramMap 的类型是 ParameterMap。

C++代码中的函数签名为:

SceneHandler::loadScene(const fs::path &filename, const ParameterMap &params) 

错误是:

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 。你想看的是三叶定义其Boost.Python接口的地方,以查看是否有注册的"转换器"将Python字符串转换为boost::fs::path对象。如果没有,你必须弄清楚对于这个库,获取可转换为正确类型的 Python 对象的正确方法是什么。

对于第二个参数,你基本上要进行相同的检查,除非StringMap已经是 Boost.Python 类型(type(paramMap.__class__)返回什么?)。看起来ParameterMap是一个类型定义

`std::map<std::string, std::string, mitsuba::SimpleStringOrdering>`

但同样,必须注册一个 Boost.Python 转换器,它可以从 Python 类型进行转换。

请注意

,这个错误已经修复了一段时间——现在有一个隐式转换,当跨越 C++/Python 障碍时,它会在 fs::p ath 和 std::string 之间双向进行。