我使用此问题/答案在Lion中安装DB2:How do I install IBM DB2 Express-C on 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与Lion中的DB2一起正常工作?
编辑:答案的移动答案
您可以使用install_name_tool来更改db2库,以查看DirectoryService.framework的复制版本,因此不必更改DYLD_LIBRARY_PATH
值得一提的是,我只是通过在Lion上安装db2 / ibm_db的过程来更新此线程,并通过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客户机以使用ibm_db python模块,并且该库不存在。
答案:
问题是DirectoryService框架中的特定符号最终在Lion中被删除(在10.2中已弃用)。由DB2 Express-C安装的libdb2.dylib尝试调用此函数,并在导入任一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等中,以永久配置您的环境。但是,请记住,这意味着在已配置环境中执行的all命令将尝试链接到雪豹版本的DirectoryService。这可能会导致其他工具出错(我还没有遇到任何错误)。谨慎的做法是仅在需要的shell中设置DYLD_LIBRARY_PATH。
在MacOS上安装ibm_db的最简单解决方案是运行以下命令:
pip3 install --no-binary "ibm_db" ibm_db
问候,