如何在Boost.Python中检查None对象及解决调用报错问题
解决Boost.Python返回模块对象时的"module object is not callable"错误
嘿,这个错误的根源其实很容易发现——你在返回找到的Boost.Python对象时多写了一对不必要的括号!
为什么会报错?
看你module_exists函数里的这段代码:
return it->second();
这里的it->second本身就是一个bpy::object类型的Python模块对象,你加了()就相当于试图调用这个模块。但Python里的普通模块是没有__call__方法的,自然就会抛出TypeError: 'module' object is not callable的错误。
修正后的代码
只需要把多余的括号去掉,直接返回存储的对象就行:
namespace bpy = boost::python; namespace fs = boost::filesystem; std::map<fs::path, bpy::object> imported_modules; bpy::object module_exists(fs::path path) { auto it = imported_modules.find(path); if (it != imported_modules.end()) { // 直接返回模块对象,不要加括号调用 return it->second; } else { // 这里返回None的写法是正确的 return bpy::object(); } }
关于调用逻辑的说明
你原来的调用代码是完全没问题的,修正函数后,下面的判断可以正常识别返回的是否为None对象:
bpy::object mod_cached = module_exists(filepath); if (!mod_cached.is_none()) { cout << "Module Found" << endl; }
另外提一句:bpy::object()确实会生成一个代表Python None的对象,这部分你的写法是正确的,不用改动~
内容的提问来源于stack exchange,提问作者sbunny
相关产品推荐
相关产品推荐

