2012-02-29 41 views
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。我没有发现任何人有类似的问题。

感谢您的任何帮助或建议。

+0

我不认为你的问题与它是一个C类有关。这看起来像是与多个模块相关的错误。我是否认为这是一种嵌入情况?由于这两个模块都是静态链接的? BP是静态链接的吗? – 2012-03-01 16:11:59

+1

是的你是对的。这是一个嵌入情况,我应该提到这一点。 boost :: python本身并不是静态链接的。在搜索了更多关于这个问题后,我发现了一个关于完全相同的问题的讨论: http://www.gossamer-threads.com/lists/python/dev/255760 看来问题来自boost:python ,它已经很老了(10岁),不太可能被解决。 我发现了一个工作周:我在模块初始化中手动设置了__模块__字段。 – 2012-03-03 17:16:17

+0

我很高兴你找到了解决方案。如果您将其添加为此问题的答案,则其他人可以对其进行修改。 – 2012-03-05 15:22:12

回答

1

根据other discussions,目前还没有理想的解决方案来解决这个问题。但是,有一种方法可以通过在模块初始化中设置__ module __字段来“手动”解决问题。

BOOST_PYTHON_MODULE(module1) 
{ 
    class_<MyClass, boost::noncopyable> myClass("MyClass", no_init) 
    .enable_pickling(); 

    myClass.attr("__module__") = "module1"; 
} 

这样,pickle就不会无法识别定义类的模块。