2013-09-10 4 views
2

Так я создал два модуля, используя подталкивание :: питон:Импорт зависимых библиотек питона от повышающего питона

BOOST_PYTHON_MODULE(A) { ... } 
BOOST_PYTHON_MODULE(B) { ... } 

, что В зависит от А. Затем я пытаюсь вызвать их, используя код Python:

import sys 
sys.path.append('path/to/modules/') 

import A 
import B 

... # python body 

Наконец я называю сценарий питона из терминала:

python path/to/python/script.py 

Это отлично работает до тех пор, как я execut e команда терминала из каталога, где я установил модули boost :: python. Однако, если я называю его от любого другого каталога, я получаю ошибку

File "path/to/python/script.py", line 6, in <module> 
    import B 
importError: dlopen(path/to/B.so, 2): Library not loaded: A.so 
Referenced from: path/to/B.so 
Reason: image not found 

Обратите внимание, он не на «импорт B», поэтому команда sys.path.append направляет его в нужное место. По какой-то причине библиотеки boost :: python не выглядят в каталогах sys.path? Есть ли способ установить это? Я попытался добавить путь в boost python, но это, похоже, влияет только на время компиляции библиотек, а не на запуск python.

Кто-нибудь знает, что делать?

Спасибо!

+0

Почему вы хотите развернуть lib? Вы можете установить зависимости во время компиляции – balki

+0

@balki: 'dlopen' является частью поведения' import'. Без статической привязки расширений в интерпретаторе, как иначе интерпретатор для динамического языка загружает библиотеку C++? –

ответ

2

Если B.so ссылки на A.so, то A.so должен быть в пути, используемом динамическим компоновщиком, когда загружается B.so. Например, перед импортом модуля B добавьте путь, содержащий A.so к переменной окружения LD_LIBRARY_PATH.

Существует различие между библиотекой и модулем. A.so - это библиотека, а не модуль. При попытке импортировать модуль Python может в конечном итоге попытаться загрузить библиотеку, требуя, чтобы библиотека инициализировала модуль. В этом случае библиотека A.so инициализирует модуль A, когда он загружается интерпретатором Python. В документации для sys.path указано, что он указывает путь поиска для модулей. Следовательно, import B найдет B.so как часть правил import и sys.path. Однако, когда динамический компоновщик загружает B.so, динамический компоновщик, а не интерпретатор Python, требует разрешения A.so.

Рассмотрите возможность использования динамического компоновщика manual для получения дополнительной информации о путях, проверенных при загрузке библиотеки.

Смежные вопросы