1
我在boost的帮助下将一些C++类暴露给python。我定义了两个与我的应用程序静态链接的不同模块。我可以使用这些模块中定义的类,衍生它们等当有多个Boost.Python模块时腌制暴露的类
BOOST_PYTHON_MODULE(module1)
{
class_<MyClass, boost::noncopyable>("MyClass", no_init)
.enable_pickling();
}
然而,我不能咸菜它们,因为没有涉及到泡菜中的错误。 __模块__属性对于我的类不正确。因此,泡菜无法让课堂回来。如果我的两个Python模块“模块1”和“模块2”,和模块1定义一个类名MyClass的,下面的代码:
print(module1.MyClass.__name__)
print(module1.MyClass.__module__)
pickle.dumps(module1.MyClass,0)
将输出
MyClass
module2
Traceback (most recent call last):
File "main.py", line 23, in <module>
pickle.dumps(module1.MyClass,0)
_pickle.PicklingError: Can't pickle <class 'module2.MyClass'>: attribute lookup
module2.MyClass failed
它证明了__模块__属性没有为这个类填充正确。我无法找到workarround。我没有发现任何人有类似的问题。
感谢您的任何帮助或建议。
我不认为你的问题与它是一个C类有关。这看起来像是与多个模块相关的错误。我是否认为这是一种嵌入情况?由于这两个模块都是静态链接的? BP是静态链接的吗? – 2012-03-01 16:11:59
是的你是对的。这是一个嵌入情况,我应该提到这一点。 boost :: python本身并不是静态链接的。在搜索了更多关于这个问题后,我发现了一个关于完全相同的问题的讨论: http://www.gossamer-threads.com/lists/python/dev/255760 看来问题来自boost:python ,它已经很老了(10岁),不太可能被解决。 我发现了一个工作周:我在模块初始化中手动设置了__模块__字段。 – 2012-03-03 17:16:17
我很高兴你找到了解决方案。如果您将其添加为此问题的答案,则其他人可以对其进行修改。 – 2012-03-05 15:22:12