0

我正在使用一个名为 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 &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> > > > >)

我可以做哪些进一步的调查?你知道问题出在哪里吗?

4

2 回答 2

2

不幸的是,尚不清楚哪个论点导致了问题。

根据您收到的错误消息,返回类型fileResolver.resolve显然是str,而不是boost::filesystem::basic_path。您要查看的是 Mitsuba 定义其 Boost.Python 接口的位置,以查看是否注册了用于将 Python 字符串转换为boost::fs::path对象的“转换器”。如果没有,您将必须弄清楚该库获取可转换为正确类型的 Python 对象的正确方法是什么。

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

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

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

于 2012-06-05T21:05:41.400 回答
0

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

于 2013-11-22T11:11:03.923 回答