【问题标题】:Python "DPI-1047 Cannot locate dlopen(libclntsh.dylib)" on macOSmacOS 上的 Python“DPI-1047 无法找到 dlopen(libclntsh.dylib)”
【发布时间】:2021-11-08 21:16:03
【问题描述】:

我收到以下错误。

cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "dlopen(libclntsh.dylib, 1): image not found".

我发现的一个解决方法是插入 cx_Oracle.init_oracle_client(lib_dir=path) 导致 Oracle 客户端库已初始化错误。

但是我没有在代码中的任何地方调用init_oracle_client。我在 Mac 上使用 Python 3.8.11 和 cx_Oracle 8.2.1。

最初运行代码时,我没有安装任何 Oracle 客户端。然后我下载了 instantclient_19_8,但是将它与 init_oracle_client 一起使用会导致已经初始化的错误。 我在这里看到了这个https://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html

我不确定 cx_Oracle 二进制文件在哪里,当我转到具有当前 anaconda 环境的位置时,我看到一个包含自述文件的 cx_Oracle-doc 文件夹。此外,在 ~ 中创建了一个 oradiag_my_username 文件夹。不确定需要修复什么。

【问题讨论】:

  • 你能显示代码吗?
  • 与代码有什么联系吗?现在错误是在调用cx_Oracle.connect(username,password,dsn)
  • 试试this similar question的答案,看看它是否能解决您的问题。
  • 可能不像评论员所说的那样适用于旧版本。确保您没有使用捆绑的 Python。 - 这似乎是第一条指令。你怎么检查那个。?我可以确认我拥有的Python版本与基础环境中的不一样。

标签: python oracle macos cx-oracle


【解决方案1】:

我的代码总是这样:

import os
import platform
if platform.system() == "Darwin":
    cx_Oracle.init_oracle_client(lib_dir=os.environ.get("HOME")+"/Downloads/instantclient_19_8")

这是最方便的解决方案。如果您收到“已初始化”错误,请确保每个 Python 进程仅调用 init_oracle_client()一次

或者,您可以找到您的 cx_Oracle 二进制文件,例如:

cjones@mac:~$ python
Python 3.9.6 (default, Aug 20 2021, 13:36:17) 
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> cx_Oracle
<module 'cx_Oracle' from '/Users/cjones/.local/lib/python3.9/site-packages/cx_Oracle.cpython-39-darwin.so'>

然后,在终端窗口中,执行以下操作:

ln -s $HOME/Downloads/instantclient_19_8/libclntsh.dylib $HOME/.local/lib/python3.9/site-packages

这适用于 macOS - 任何阅读本文的 Linux 用户都应该知道这个解决方案不适用于 Linux。

oradiag_xxx 目录用于 Oracle“客户端”跟踪。您可以随时删除。

【讨论】:

  • 在尝试查看 init_oracle_client() 的其他调用位置上花费了太多时间。令人惊讶的是仍然有错误。符号链接方法效果很好。感谢 oradiag 的提示,不确定该文件夹是从哪里神秘地出现的。
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2019-01-06
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多