Межмодульное разрешение имен исключений через boost python не работает? - PullRequest
4 голосов
/ 11 августа 2010

Вот моя проблема:

У меня есть два модуля 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 Ответ

2 голосов
/ 23 августа 2010

Я нашел обходной путь к своей проблеме. Основываясь на этом и тексте ссылки , я понял, что добавление

import sys, dl
sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)

до того, как мои включения решают проблему, заставляя python открывать библиотеки в немедленномРежим.Но я все еще надеюсь на альтернативное решение, если оно есть.Как упоминалось в первой ссылке, я подозреваю, что это может привести к непредвиденным последствиям (я уже знаю, что конфликт имен может быть проблемой, и я подозреваю, что производительность также может быть затронута, но есть ли другие побочные эффекты?)

...