如何在Mac OS X 10.7 Lion上使用ibm_db或PyDB2模块连接DB2?

2 投票
3 回答
4242 浏览
提问于 2025-04-16 23:39

我参考了这个问题和答案来在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 个回答

0

在MacOS上安装ibm_db最简单的方法就是运行下面这个命令:

pip3 install --no-binary "ibm_db" ibm_db

祝好,

2

回答:

问题在于,目录服务框架中的一个特定符号在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。

1

你可以使用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模块,而这个库并不存在。

撰写回答