2014-11-24 71 views
0

我試圖嵌入的wxPython在wxWidgets的應用程序,我得到以下錯誤:Python嵌入 - 加載已經加載的模塊

../src/common/object.cpp(251):斷言「classTable- > Get(m_className)== NULL「在RTTI表中已經在Register():Class」wxCommandEvent「中失敗 - 您是否多次使用了IMPLEMENT_DYNAMIC_CLASS()或將某個目標文件鏈接了兩次)?

我已經追查這件事到: wxPyCoreAPIPtr =(wxPyCoreAPI *)PyCObject_Import( 「WX 核心」, 「_wxPyCoreAPI」);

所以我猜測這是失敗的,因爲它試圖對已經加載的.so文件進行加載(這是由C和Python代碼所需的核心wxwidgets庫)。我可以通過dlopen的RTLD_NOLOAD標誌獲得打開的.so的句柄。

有沒有什麼辦法給Python的句柄,並告訴它把該句柄「加載」到解釋器的上下文中?

編輯:剛纔注意到,這個問題在wxPython的「embedded」示例中可以重現,使用wxWidgets origin/WX_3_0_BRANCH,Python 2.7,wxPython origin/master。

此外,它可能是特定於gtk3配置......它似乎在我用gtk2編譯時工作。

回答

0

問題是,wxPython是用gtk2標誌,wxWidgets gtk3編譯的。在/usr/lib/libwx_gtk2u_core-3.0.so的.text段

信息符號__static_initialization_and_destruction_0 __static_initialization_and_destruction_0(INT,INT):

您可以在gdb傾銷斷言附近的標誌之一,確定這一點。 0

要重建wxPython中,你需要手動移動build目錄別的地方(或重新安裝將似乎工作,但實際上不會重建任何東西)。

然後使用:蟒蛇setup.py build_ext WXPORT = gtk3

您應該看到.so文件正在建立針對gtk3:

C++ -pthread -shared -Wl,-O1輪候冊, - Bsymbolic函數-Wl,-Bsymbolic函數-Wl,-z,relro -fno嚴格走樣-DNDEBUG -g -fwrapv -O2 -Wall -Wstrict的原型-D_FORTIFY_SOURCE = 2 -g -fstack保護器--param = ssp-buffer-size = 4 -Wformat -Werror = format-security build/temp.linux-x86_64-2.7/src/gtk/wizard_wrap.o -L/usr/X11R6/lib -lwx_gtk3u_xrc-3.0 -lwx_gtk3u_html-3.0 - lwx_gtk3u_qa-3.0 -lwx_gtk3u_adv-3.0 -lwx_gtk3u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0 -o構建/ lib.linux-x86_64-2.7/WX/_wizard.so -pt hread

(注意wx_gtk3u_xxx文件,VS:wx_gtk2u_xxx)

則:

蟒蛇的setup.py安裝WXPORT = gtk3

作品!