DPI-1047错误本质是缺失或路径错误的Oracle客户端库;需确保Instant Client位数与Python严格一致,通过init_oracle_client()或PATH指定路径,Linux/macOS须用LD_LIBRARY_PATH,NLS_LANG须在import cx_Oracle前设置。

cx_Oracle 报 DPI-1047 错误,本质是缺 Oracle 客户端库
绝大多数 cxDPI-1047 报错(比如 “64-bit Oracle Client library cannot be loaded”)不是 Python 或 cx_Oracle 本身的问题,而是系统根本找不到 Oracle 客户端的动态链接库(oci.dll、oraocieiXX.dll 等)。Windows 下常见报错还包括 ImportError: DLL load failed,Linux 下则是 libclntsh.so not found。这些都指向同一个根源:没装 Instant Client,或装了但路径没对上。
Instant Client 版本必须和 Python 位数严格一致
这是最容易翻车的点——和 Oracle 服务端版本无关,只看你的 python.exe 是 32 位还是 64 位:
- 运行
python -c "import platform; print(platform.architecture())",输出('64bit', 'WindowsPE')就必须用 x64 版 Instant Client - 哪怕远程 Oracle 是 11g 32 位,你本地 Python 是 64 位,也得下
instantclient-basic-windows.x64-11.2.0.4.0.zip或更高兼容版(如 19c client 可连 11g) - 下载地址认准 Oracle 官网:
https://www.oracle.com/database/technologies/instant-client.html,别用第三方镜像或旧版打包站 - 不建议混用:已装完整 Oracle Client(如 Oracle 12c Desktop)的机器,再放 Instant Client 很容易因 PATH 冲突导致
ORA-12557
Windows 下 PATH 和 init_oracle_client() 二选一即可
两种方式都能让 cx_Oracle 找到库,但推荐后者,更干净、不污染全局环境:
- 方式一(设系统 PATH):解压 Instant Client 到
C:instantclient_19_20,把该路径加进系统环境变量PATH,重启终端生效 - 方式二(代码内指定):在 import cx_Oracle 后第一行加
cx_Oracle.init_oracle_client(lib_dir=r"C:instantclient_19_20"),路径必须是原始字符串(r"")或双反斜杠("C:\instantclient_19_20") - 二者不要同时用;若用了
init_oracle_client(),PATH 可以完全不设 - Linux/macOS 必须靠
LD_LIBRARY_PATH(Linux)或LIBRARY_PATH(macOS),init_oracle_client()在这些平台无效
NLS_LANG 和中文乱码问题不能靠环境变量硬塞
NLS_LANG 设错会导致查询结果中文变问号或报 UnicodeDecodeError,但直接改系统环境变量风险高(影响其他 Oracle 工具),推荐代码中控制:
- 连接前加:
import os; os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"(服务端字符集为 AL32UTF8 时) - 若服务端是 ZHS16GBK,改为
"SIMPLIFIED CHINESE_CHINA.ZHS16GBK" - 注意:这个设置必须在
import cx_Oracle之前,否则无效 - 不建议在 Windows 系统变量里设
NLS_LANG,尤其当机器还跑 PL/SQL Developer 或 SQL*Plus 时,容易引发客户端和服务端编码不一致
真正卡住的往往不是语法,而是 init_oracle_client() 路径写错、Python 位数和 Instant Client 位数对不上、或者 NLS_LANG 放错了执行顺序。这些地方一旦出问题,错误信息会绕很远才暴露真实原因。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











