Общая библиотека, распространяемая в python wheel, не найдена

У меня есть модуль python, который содержит расширение C++, а также общую библиотеку, от которой зависит расширение C++. Общая библиотека выбирается setuptools как extra_object в расширении. После запуска python setup.py bdist_wheel правильно сгенерированный объект колеса модуля имеет следующую структуру каталогов:

+-pymodule.whl
| +-pymodule
| +-pymodule-version.dist-info
| +-extension.so
| +-shared_lib.so

Чтобы установить это колесо, в моей среде Python я вызываю pip install pymodule.whl, который копирует исходные коды Python, а также файлы .so в каталог site-packages среды.

После установки модуля можно попытаться импортировать модуль, вызвав import pymodule в терминале среды. Это вызывает исключение:

ImportError: shared_lib.so: cannot open shared object file: No such file or directory

Это исключение можно устранить, добавив соответствующий каталог site-packages к переменной LD_LIBRARY_PATH; однако кажется, что это должно работать из коробки, особенно с учетом того, что python явно может найти extension.so.

Есть ли способ заставить Python найти эту общую библиотеку без необходимости явно указывать LD_LIBRARY_PATH в месте установки (например, site-packages)?

Вопрос Этот решает аналогичную проблему, используя данные пакета и явно указывая место установки для разделяемой библиотеки. Проблема с этим подходом заключается в том, что общий объект отделен от расширения. В моем случае общая библиотека и расширение являются целями, созданными одной и той же сборкой cmake. Ранее я пытался использовать skbuild для создания расширений на основе cmake; однако, согласно Эта проблема, в skbuild есть аналогичная проблема с включением других библиотек, созданных как часть сборки расширения.

Возможный дубликат Зависимости общей библиотеки от distutils

hoefling 02.05.2018 19:53

@hoefling, я видел решение, представленное в ссылке, которой вы поделились; однако это решение действительно ориентировано на стороннюю общую библиотеку, которая не создается как часть сборки расширения. Это может помочь решить ту же проблему; однако затем объект отделяется от самого определения расширения, и я не уверен, могу ли я быть уверен, что он будет собирать эти данные пакета только после того, как расширение завершит сборку.

mcguip 03.05.2018 10:16

У меня точно такая же проблема, это особенно расстраивает, так как создание яйца с помощью python setup.py install делает работает из коробки.

Peter 29.08.2020 14:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
1 467
0

Другие вопросы по теме