Как заставить модули Python ibm_db или PyDB2 работать с DB2 в Mac OS X 10.7 Lion? - PullRequest
2 голосов
/ 16 августа 2011

Я использовал этот вопрос / ответ для установки 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?

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

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Ответ:

Проблема в том, что определенный символ в структуре 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 и т. Д. Для постоянной настройки вашей среды.Помните, однако, что это означает, что все команды , выполняемые в сконфигурированной среде, будут пытаться соединиться с версией SnowSeopard из DirectoryService.Это может привести к ошибкам с другими инструментами (я еще не сталкивался с какими-либо).Было бы целесообразно устанавливать DYLD_LIBRARY_PATH только в оболочках, где это необходимо.

1 голос
/ 23 декабря 2011

Вы можете изменить библиотеки 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

Ответ (в случае исчезновения вышеупомянутой темы):

Скопируйте SnowSoper 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, а эта библиотека отсутствует.

...