如何让 ibm_db 或 PyDB2 python 模块在 Mac OS X 10.7 Lion 中与 DB2 一起使用?

Posted

技术标签:

【中文标题】如何让 ibm_db 或 PyDB2 python 模块在 Mac OS X 10.7 Lion 中与 DB2 一起使用?【英文标题】:How do I get ibm_db or PyDB2 python modules to work with DB2 in Mac OS X 10.7 Lion? 【发布时间】:2011-10-27 17:29:30 【问题描述】:

我使用这个问题/答案在 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 一起正常工作?

编辑:移动答案的答案

【问题讨论】:

【参考方案1】:

答案:

问题是 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 等以永久配置您的环境。但是请记住,这意味着在配置的环境中执行的所有命令将尝试链接到 DirectoryService 的雪豹版本。这可能会导致其他工具出现错误(我还没有遇到任何工具)。谨慎的做法是只在需要它的 shell 中设置 DYLD_LIBRARY_PATH。

【讨论】:

【参考方案2】:

您可以使用 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

答案(如果上面的帖子消失了):

将雪豹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 模块,并且这个库不存在。

【讨论】:

确认这对我有用。这也是一个更清洁的解决方案。谢谢 我再次从 IBM 下载了 Mac 客户端以使用 Mountain Lion 进行测试。这似乎没有任何修改就可以工作(大概在去年的某个时候已经修补过)【参考方案3】:

在 MacOS 上安装 ibm_db 最简单的解决方案是运行以​​下命令:

pip3 install --no-binary "ibm_db" ibm_db

问候,

【讨论】:

以上是关于如何让 ibm_db 或 PyDB2 python 模块在 Mac OS X 10.7 Lion 中与 DB2 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 的 ibm_db 连接到 informix

python用ibm_db模块操作db2

python操作db2和mysql ,ibm_db

离线安装python的ibm_db模块

Python 3和IBM_DB安装问题

ibm_db 在 Python 中使用 SSLClientKeystoredb 连接 DB2