Динамическая загрузка двух версий libpython - PullRequest
1 голос
/ 23 июля 2010

У меня есть программа, которая включает в себя интерпретаторы python2 и python3.Разделяемые библиотеки libpython dlopen() редактируются соответствующими командами, которые обеспечивают доступ к интерпретаторам, и каждый интерпретатор поддерживает свое собственное состояние.

Все это прекрасно работает, если пользователь использует только чистые модули Python или встроенные функции.Попытка загрузить расширение C (например, termios) затем жалуется на «неопределенный символ: PyExc_TypeError».Это происходит потому, что расширения C не связаны с libpython.Вышестоящий Python не считает, что это проблема .

Чтобы обойти это, я могу изменить вызовы dlopen() в моей программе, чтобы разделяемые библиотеки libpython использовали RTLD_GLOBAL.Однако, как только я это сделаю, попытка использовать оба интерпретатора python2 и python3 в одном и том же сеансе программы вызывает ABRT в процессе вызова Py_Initialize для того, какой интерпретатор был вызван вторым.Использование только одного из интерпретаторов работает нормально.

Любая идея, как заставить это работать, когда расширения C не будут связаны с libpython, поэтому требуется использование RTLD_GLOBAL?

1 Ответ

1 голос
/ 23 июля 2010

Извините, но это не сработает так, как вы этого хотите. Решение обычно включает связывание каждого расширения с версионными символами libpython; или можно иметь компоновщик с поддержкой пространства имен, чтобы можно было сопоставить каждую библиотеку с другим пространством имен, а не с глобальным. К сожалению, ни один из этих вариантов не может быть легко применен, так что вы, вероятно, застряли в многопроцессорной модели. Просто разветвитесь и получите одну ссылку на процесс для каждой версии Python. Сложный вопрос заключается в том, как совместно использовать любые данные, которые привели к тому, что вам потребовались два разных интерпретатора Python. Возможно, описание какой проблемы привело к вопросу, может помочь найти лучшее решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...