Я использую библиотеку 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, которые могут решить мою проблему, было бы здорово узнать.)
Задача ещё не решена.