Могу ли я установить общий объект библиотеки C / C ++ в Python virtualenv?

Я использую библиотеку C ++, которая может быть построена как модуль Python с использованием SWIG.

Результатом сборки модуля является общий объект C ++, назовите его libFoo.soи модуль Python, который включает в себя как файл Python, Foo.pyи некоторый общий объект, который используется Python для взаимодействия с libFoo.so, который называется _Foo.so,

Теперь я могу sudo make install и библиотека C ++, и модуль Python, и все работает нормально, если загрузить Python и сделать import Foo,

Если я sudo make install библиотеки C ++, а затем установите модуль Python в virtualenv (путем настройки файла Makefile, чтобы он использовал версию Python virtualenv для запуска setup.py) все тоже работает. Если я запускаю Python из venv, я могу импортировать Foo, и библиотека C ++ загружается правильно. Вне вену я не могу импортировать Фу.

Теперь я могу собрать и установить библиотеку C ++, чтобы она устанавливалась в venv/lib, Затем я могу правильно собрать пакет Python и установить его в virtualenv. Если я запускаю версию Python virtualenv, импорт Foo завершается неудачно из-за отсутствующего символа, который, кажется, означает, что он нашел Foo.py а также _Foo.so, но нет libFoo.so,

Если я сделаю

LD_PRELOAD=venv/lib/libFoo.so python

импорт завершен успешно и библиотека работает правильно. (Обратите внимание, что в каталоге нет ничего особенного venv/lib в этом случае. Я мог бы в равной степени установить библиотеку где-то совершенно другое и передать это имя файла.)

Однако я не могу заставить Python искать в папке venv / lib разделяемый объект C ++ при попытке загрузить эту библиотеку. настройка LD_LIBRARY_PATH кажется, ничего не меняет, я полагаю, потому что либо версия Python virtualenv игнорирует эту переменную, либо потому, что в самом модуле Python есть настройки, которые определяют, как должен загружаться объект C ++.

Есть ли способ правильно установить библиотеку C ++ или C в virtualenv, чтобы код Python, который запускается в этой виртуальной среде, правильно загружал ее? Или это просто что-то, на что не был рассчитан virtualenvs?

(Я не думаю, что механизм этого вопроса зависит от SWIG, но если SWIG имеет какие-либо последствия, или если есть методы, конкретно связанные с SWIG, которые могут решить мою проблему, было бы здорово узнать.)

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]