嵌入Python - 加载已加载的模块

时间:2014-11-24 19:38:54

标签: python wxpython wxwidgets embedding dlopen

我试图在wxWidgets应用程序中嵌入wxPython,我收到以下错误:

../ src / common / object.cpp(251):assert" classTable-> Get(m_className)== NULL"在Register()中失败:Class" wxCommandEvent"已经在RTTI表中 - 您多次使用过IMPLEMENT_DYNAMIC_CLASS()或者连接了一些目标文件两次)?

我已将此追溯到: wxPyCoreAPIPtr =(wxPyCoreAPI *)PyCObject_Import(" wx。 core "," _wxPyCoreAPI");

所以我猜测这是失败的,因为它试图破坏已经加载的.so(C和Python代码都需要的核心wxwidgets库)。我可以通过dlopen的RTLD_NOLOAD标志获取打开的.so的句柄。

有没有办法把这个句柄交给Python并告诉它" load"处理解释器的上下文?

编辑:刚刚注意到,这个问题在" embedded"中是可以重现的。 wxPython中的示例,使用wxWidgets origin / WX_3_0_BRANCH,Python 2.7,wxPython origin / master。

此外,它可能特定于gtk3配置......当我使用gtk2编译时它似乎正在工作。

1 个答案:

答案 0 :(得分:0)

问题是wxPython是用gtk2标志编译的,wxWidgets是gtk3。

您可以通过转储断言附近的一个符号来确定gdb:

info symbol __static_initialization_and_destruction_0 /usst/lib/libwx_gtk2u_core-3.0.so.0的.text中的__static_initialization_and_destruction_0(int,int)

要重建wxPython,您需要在其他地方手动移动构建目录(或者重新安装似乎可以工作,但实际上不会重建任何东西)。

然后使用:python setup.py build_ext WXPORT = gtk3

您应该看到.so文件是针对gtk3构建的:

c ++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE = 2 -g -fstack-protector --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 build / lib.linux-x86_64- 2.7 / wx / _wizard.so -pthread

(请注意wx_gtk3u_xxx文件,vs:wx_gtk2u_xxx)

然后:

python setup.py install WXPORT = gtk3

作品!