Как заставить модули Python ibm_db или PyDB2 работать с DB2 в Mac OS X 10.7 Lion?

Я использовал этот вопрос/ответ для установки DB2 в Lion: Как установить IBM DB2 Express-C в Mac OS X 10.7 Lion?

После настройки моих баз данных я могу использовать db2 из командной строки для выполнения запросов, но оба модуля Python ibm_db и PyDB2 не могут быть импортированы со следующей ошибкой:

>>> import ibm_db
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Python/2.7/site-packages/ibm_db-1.0.4-py2.7-macosx-10.7-intel.egg/ibm_db.so, 2): Symbol not found: _dsIsDirServiceRunning
 Referenced from: /Users/<username>/sqllib/lib64/libdb2.dylib
 Expected in: /System/Library/Frameworks/DirectoryService.framework/Versions/A/DirectoryService

Как исправить это и заставить ibm_db и PyDB2 правильно работать с DB2 в Lion?

редактировать: перемещен ответ на ответы


person drootang    schedule 16.08.2011    source источник


Ответы (3)


Вы можете изменить библиотеки db2 с помощью install_name_tool, чтобы просмотреть скопированную версию DirectoryService.framework, поэтому вам не нужно изменять DYLD_LIBRARY_PATH.

Полная заслуга принадлежит следующему: я просто обновляю эту ветку, пройдя через процесс установки db2 / ibm_db на Lion и считаю эту ветку одной из самых популярных в Google.

http://www.ibm.com/developerworks/forums/thread.jspa?threadID=238136&start=30&tstart=0

с другими вариантами, описанными здесь:

http://www.ibm.com/developerworks/forums/message.jspa?messageID=14604855#14604855

Ответ (если тема выше исчезнет):

Скопируйте Snow Leopard DirectoryService.framework в

/opt/SL_Frameworks/DirectoryService.framework 

потом

cd /opt/IBM/db2/V9.5/
install_name_tool -change /System/Library/Frameworks/DirectoryService.framework/Versions/A/DirectoryService /opt/SL_Frameworks/DirectoryService.framework/Versions/A/DirectoryService lib64/libdb2sec.dylib
install_name_tool -change /System/Library/Frameworks/DirectoryService.framework/Versions/A/DirectoryService /opt/SL_Frameworks/DirectoryService.framework/Versions/A/DirectoryService lib64/libdb2.dylib

В указанном сообщении упоминается изменение третьей библиотеки

libdb2e.dylib

однако я установил клиент db2 только для использования модуля Python ibm_db, а этой библиотеки нет.

person Chris    schedule 23.12.2011
comment
Подтвердил, что это сработало для меня. Это также более чистое решение. Спасибо - person drootang; 14.06.2012
comment
Я снова загрузил клиент Mac из IBM, чтобы протестировать его с помощью Mountain Lion. Кажется, это работает без каких-либо изменений (предположительно, оно было исправлено в какой-то момент в прошлом году) - person Chris; 26.07.2012

Ответ:

Проблема в том, что конкретный символ в структуре DirectoryService был окончательно удален в Lion (он устарел в 10.2). libdb2.dylib, установленный DB2 Express-C, пытается вызвать эту функцию и вызывает ошибку при импорте любого из модулей Python.

Чтобы обойти это, вам нужно настроить вашу среду для связи с более старой версией инфраструктуры DirectoryService. Для этого вам понадобится установленный Snow Leopard (он может работать со старыми версиями, но я не проверял его, и вам понадобится самая новая версия, которую вы можете достать, это, конечно, не Lion). Вы найдете инфраструктуру DirectoryService, установленную здесь:

/System/Library/Frameworks/DirectoryService.framework/

Скопируйте этот каталог из установки Snow Leopard в любое место установки Lion. Для этого примера я скопировал каталог DirectoryService.framework в каталог OldFrameworks в ~ :

~/OldFrameworks/DirectoryService.framework/

Установите переменную среды $DYLD_LIBRARY_PATH, чтобы она содержала путь к фактической библиотеке:

export DYLD_LIBRARY_PATH=${HOME}/OldFrameworks/DirectoryService.framework/Versions/Current/:${DYLD_LIBRARY_PATH}

Любая среда, в которой вы выполняете указанную выше команду, будет настроена так, чтобы позволить python импортировать ibm_db или PyDB2. Добавьте его в свой .profile, .bashrc и т. д., чтобы настроить среду на постоянной основе. Однако помните, что это означает, что все команды, выполняемые в настроенной среде, будут пытаться связать версию DirectoryService со снежным барсом. Это потенциально может вызвать ошибки с другими инструментами (мне еще не приходилось сталкиваться с ними). Было бы разумно устанавливать DYLD_LIBRARY_PATH только в оболочках, где это необходимо.

person drootang    schedule 16.08.2011

Самый простой способ установить ibm_db в MacOS — запустить следующую команду:

pip3 install --no-binary "ibm_db" ibm_db

С уважением,

person Patrick    schedule 23.02.2020