Хобрук: Ваш путь к мастерству в программировании

Встраивание Python с загрузкой уже загруженного модуля

Я пытаюсь внедрить wxPython в приложение wxWidgets и получаю следующую ошибку:

../src/common/object.cpp(251): утверждение "classTable->Get(m_className) == NULL" не удалось в Register(): класс "wxCommandEvent" уже находится в таблице RTTI - вы использовали IMPLEMENT_DYNAMIC_CLASS() несколько раз или дважды связал какой-то объектный файл)?

Я проследил это до: wxPyCoreAPIPtr = (wxPyCoreAPI*)PyCObject_Import("wx.core", "_wxPyCoreAPI");

Итак, я предполагаю, что это терпит неудачу, потому что он пытается открыть .so, который уже был загружен (основная библиотека wxwidgets, которая необходима как для кода C, так и для Python). Я могу получить дескриптор открытого .so с помощью флага dlopen RTLD_NOLOAD.

Есть ли способ передать этот дескриптор Python и сказать ему «загрузить» этот дескриптор в контекст интерпретатора?

Изменить: только что заметил, что эта проблема воспроизводится во «встроенном» образце в wxPython с использованием wxWidgets origin/WX_3_0_BRANCH, Python 2.7, wxPython origin/master.

Кроме того, это может быть связано с конфигурациями gtk3... казалось, что это работает, когда я компилировал с gtk2.


Ответы:


1

Проблема в том, что wxPython компилируется с флагом gtk2, wxWidgets gtk3.

Вы можете определить это в gdb, сбросив один из символов рядом с утверждением:

информационный символ __static_initialization_and_destruction_0 __static_initialization_and_destruction_0(int, int) в разделе .text файла /usr/lib/libwx_gtk2u_core-3.0.so.0

Чтобы пересобрать 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- прототипы -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 / Библиотека -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 -pthread

(обратите внимание на файлы wx_gtk3u_xxx, vs: wx_gtk2u_xxx)

потом:

python setup.py установить WXPORT=gtk3

работает!

24.11.2014
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...