2014-11-24 110 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

作品!