如何在Mac OS X 10.7 Lion上使用ibm_db或PyDB2模块连接DB2?
我参考了这个问题和答案来在Lion系统上安装DB2:如何在Mac OS X 10.7 Lion上安装IBM DB2 Express-C?
在配置好我的数据库后,我可以在命令行中使用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在Lion上正常工作?
编辑:将答案移到答案部分
3 个回答
在MacOS上安装ibm_db最简单的方法就是运行下面这个命令:
pip3 install --no-binary "ibm_db" ibm_db
祝好,
回答:
问题在于,目录服务框架中的一个特定符号在Lion系统中被彻底移除了(在10.2版本时就已经不推荐使用了)。而DB2 Express-C安装的libdb2.dylib库试图调用这个函数,因此在导入任何python模块时就会出现错误。
要解决这个问题,你需要配置你的环境,让它链接到一个旧版本的目录服务框架。为此,你需要一份Snow Leopard的安装(可能也能用更旧的版本,但我没有测试过,当然你要找最新的,除了Lion以外的版本)。你可以在这里找到目录服务框架的安装位置:
/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等文件中,以便永久配置你的环境。不过要记住,这样做意味着在这个配置的环境中执行的所有命令都会尝试链接到Snow Leopard版本的目录服务。这可能会导致其他工具出现错误(我还没有遇到过这种情况)。因此,最好只在需要的shell中设置DYLD_LIBRARY_PATH。
你可以使用install_name_tool来修改db2库,让它指向复制的DirectoryService.framework版本,这样你就不需要去改DYLD_LIBRARY_PATH了。
这篇帖子里的内容要归功于其他人,我只是更新一下这个讨论,因为我在Lion系统上安装db2 / ibm_db的过程中,发现这篇帖子在谷歌搜索中是最热门的结果之一。
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客户端来使用ibm_db这个Python模块,而这个库并不存在。