Python 程序无法找到 Oracle 的 64 位客户端库 (libclntsh.so)

数据库错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help

这个错误表明 Python 程序无法找到 Oracle 的 64 位客户端库 (libclntsh.so)。以下是完整的解决方案:


完整解决方案(Linux 环境)

1. 安装 Oracle Instant Client(推荐方式)

(1) 下载 Oracle Instant Client Basic 包

从 Oracle 官网下载 19c21c 版本的 Basic 包:

bash

复制代码
# 进入下载目录(如 /opt/oracle)
sudo mkdir -p /opt/oracle
cd /opt/oracle

# 下载 Basic 包(示例为 19.19 版本)
wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-basic-linux.x64-19.9.0.0.0dbru.zip

# 解压
sudo unzip instantclient-basic-linux.x64-19.9.0.0.0dbru.zip

如果 wget 报错,可手动从 Oracle 官网 下载并上传到服务器。

(2) 设置环境变量

bash

复制代码
# 临时生效(当前会话)
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9

# 永久生效(写入 ~/.bashrc 或 /etc/profile)
echo 'export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9' >> ~/.bashrc
source ~/.bashrc
(3) 创建符号链接(关键步骤!)

bash

复制代码
sudo ln -s /opt/oracle/instantclient_19_9/libclntsh.so.19.1 /usr/lib/libclntsh.so

sudo yum install libnsl


2. 验证是否生效

bash

复制代码
# 检查库文件是否存在
ls -l /opt/oracle/instantclient_19_9/libclntsh.so*

# 检查环境变量
echo $LD_LIBRARY_PATH

# 测试 Python 是否能导入 cx_Oracle
python3 -c "import cx_Oracle; print('Success')"

如果没有报错,说明配置成功!


3. 在你的 Python 代码中强制指定 Oracle 客户端路径

如果仍然报错,可以在代码中显式指定 Oracle 客户端路径:

python

复制代码
import cx_Oracle

# 手动指定 Oracle 客户端路径
cx_Oracle.init_oracle_client(lib_dir="/opt/oracle/instantclient_19_9")

# 然后正常连接数据库
conn = cx_Oracle.connect("DB_MON/db_mon@rpt2.fastfish.com.cn:1521/orcl")

4. 其他可能的问题

(1) 32 位 vs 64 位不匹配
  • 确保 Python 和 Oracle Instant Client 都是 64 位

    bash

    复制代码
    # 检查 Python 位数
    python3 -c "import sys; print(sys.maxsize > 2**32)"
    • 输出 True 表示 64 位 Python。
  • 检查 Oracle Instant Client 位数:

    bash

    复制代码
    file /opt/oracle/instantclient_19_9/libclntsh.so
    • 应显示 ELF 64-bit
(2) 缺少 libaio 依赖

bash

复制代码
# CentOS/RHEL
sudo yum install libaio

# Ubuntu/Debian
sudo apt-get install libaio1
(3) 文件权限问题

确保当前用户有权访问 Oracle Instant Client:

bash

复制代码
sudo chmod -R +r /opt/oracle/instantclient_19_9

5. 最终代码示例

python

复制代码
import cx_Oracle
import os

# 设置 Oracle 客户端路径(可选)
os.environ["LD_LIBRARY_PATH"] = "/opt/oracle/instantclient_19_9"

# 显式初始化 Oracle 客户端
cx_Oracle.init_oracle_client(lib_dir="/opt/oracle/instantclient_19_9")

# 连接数据库
try:
    conn = cx_Oracle.connect("DB_MON/db_mon@rpt2.fastfish.com.cn:1521/orcl")
    print("连接成功!")
    conn.close()
except Exception as e:
    print("连接失败:", e)

总结

问题 解决方案
DPI-1047 错误 安装 Oracle Instant Client 并设置 LD_LIBRARY_PATH
libclntsh.so 找不到 检查路径并创建符号链接
32/64 位不匹配 确保 Python 和 Oracle 客户端都是 64 位
缺少 libaio 安装 libaioyum install libaioapt install libaio1
权限问题 确保 /opt/oracle 可读

如果仍然报错,请检查:

  1. 是否下载了正确版本的 Instant Client?

  2. LD_LIBRARY_PATH 是否生效?

  3. 是否执行了 source ~/.bashrc

希望这能彻底解决问题! 🚀

方法1:直接通过命令修改(临时生效)

bash

复制代码
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9
方法2:永久修改(编辑.bashrc文件)
  1. 打开.bashrc文件:

bash

复制代码
nano ~/.bashrc
  1. 找到设置LD_LIBRARY_PATH的行(可能是这样的):

bash

复制代码
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9:/opt/oracle/instantclient_19_9:
  1. 修改为(删除重复路径和结尾冒号):

bash

复制代码
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9
  1. 保存退出nano:
  • Ctrl+O 保存

  • Enter 确认

  • Ctrl+X 退出

  1. 使修改生效:

bash

复制代码
source ~/.bashrc
相关推荐
love530love5 分钟前
【保姆级教程】阿里 Wan2.1-T2V-14B 模型本地部署全流程:从环境配置到视频生成(附避坑指南)
人工智能·windows·python·开源·大模型·github·音视频
He19550137 分钟前
Go初级之十:错误处理与程序健壮性
开发语言·python·golang
和鲸社区1 小时前
《斯坦福CS336》作业1开源,从0手搓大模型|代码复现+免环境配置
人工智能·python·深度学习·计算机视觉·语言模型·自然语言处理·nlp
豌豆花下猫2 小时前
Python 潮流周刊#118:Python 异步为何不够流行?(摘要)
后端·python·ai
THMAIL2 小时前
深度学习从入门到精通 - LSTM与GRU深度剖析:破解长序列记忆遗忘困境
人工智能·python·深度学习·算法·机器学习·逻辑回归·lstm
wheeldown2 小时前
【数学建模】数据预处理入门:从理论到动手操作
python·数学建模·matlab·python3.11
多打代码3 小时前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
@CLoudbays_Martin113 小时前
为什么动态视频业务内容不可以被CDN静态缓存?
java·运维·服务器·javascript·网络·python·php
程序猿炎义3 小时前
【NVIDIA AIQ】自定义函数实践
人工智能·python·学习
THMAIL4 小时前
深度学习从入门到精通 - BERT与预训练模型:NLP领域的核弹级技术详解
人工智能·python·深度学习·自然语言处理·性能优化·bert