2012-02-29 40 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就不會無法識別定義類的模塊。