Межмодульное разрешение имен исключений через boost python не работает?
Вот моя проблема:
У меня есть два модуля C++, A и B, которые построены как динамически связанные библиотеки. A предлагает основные математические функции и пользовательские типы исключений. B - это модуль более высокого уровня, который использует A.
B::someFunction() вызывает функцию из A и пытается перехватить пользовательское исключение A:MyExceptionFromA, чтобы преобразовать его в пользовательский тип B:MyExceptionFromB (поскольку пользователям модуля B не нужно знать о деталях реализации A).
Все работает нормально, пока я остаюсь в домене C++. Однако, если я раскрываю B::someFunction() в python через boost python, исключение больше не перехватывается в модуле C++.
Я могу поймать std::runtime_error, из которого происходит A:MyExceptionFromA, и вызвать typeid(e).name(), чтобы получить правильное искаженное имя, поэтому я знаю, что выдается правильное исключение. Поэтому я подозреваю, что проблема связана с разрешением этого искаженного символа в правильный тип исключения.
Я нашел эту ссылку, которая объясняет, что "python использует [островную] модель для открытия модулей расширения, так что разработчикам модулей расширения не нужно знать, какие символы могут использовать другие модули расширения". Я подозреваю, что это часть проблемы / решения, но я недостаточно знаю о разрешении символов, чтобы понять, как решить мою проблему.
Есть идеи?
1 ответ
Я нашел обходной путь к моей проблеме. Основываясь на этом и тексте ссылки, я понял, что добавление
import sys, dl
sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)
прежде чем мой include решит проблему, заставив python немедленно открывать библиотеки в глобальном режиме. Но я все еще надеюсь на альтернативное решение, если оно есть. Как упоминалось в первой ссылке, я подозреваю, что это может привести к непредвиденным последствиям (я уже знаю, что конфликт имен может быть проблемой, и я подозреваю, что производительность также может быть затронута, но есть ли другие побочные эффекты?)