Python + cx_Oracle:无法获取Oracle环境句柄

4 投票
1 回答
6901 浏览
提问于 2025-04-18 18:48

背景
我的操作系统是Win7 64位。
我使用的Python是2.7 64位,来自python-2.7.8.amd64.msi。
我的cx_Oracle是5.0 64位,来自cx_Oracle-5.0.4-10g-unicode.win-amd64-py2.7.msi。
我的Oracle客户端是10.1(我不知道是32位还是64位,但SQL*Plus是10.1.0.2.0)。

数据库是:
Oracle Database 10g 企业版 版本 10.2.0.4.0 - 64位
PL/SQL 版本 10.2.0.4.0 - 生产版
核心 10.2.0.4.0 - 生产版
64位Windows的TNS:版本10.2.0.4.0 - 生产版
NLSRTL 版本 10.2.0.4.0 - 生产版

ORACLE_HOME变量是根据haki的回复添加的。
C:\Oracle\product\10.1.0\Client_1\

问题依然存在,无法解决。

ORACLE_HOME尝试使用Oracle即时客户端,来自instantclient-basic-win64-10.2.0.5.zip。
C:\instantclient_10_2\

C:\Users\PavilionG4>sqlplus Lee/123@chstchmp
错误6:初始化SQL*Plus时出错
找不到消息文件sp1.msb
SP2-0750:您可能需要将ORACLE_HOME设置为您的Oracle软件目录

我的sql*plus不让我设置Oracle。

ORACLE_HOME又回到:
C:\Oracle\product\10.1.0\Client_1\

PATH变量:
C:\Program Files (x86)\Seagate Software\NOTES\
C:\Program Files (x86)\Seagate Software\NOTES\DATA\
C:\Program Files (x86)\Java\jdk1.7.0_05\bin
C:\Oracle\product\10.1.0\Client_1\bin
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin
C:\app\PavilionG4\product\11.2.0\dbhome_1\bin
C:\app\PavilionG4\product\11.2.0\client_2\bin
c:\Program Files (x86)\AMD APP\bin\x86_64
c:\Program Files (x86)\AMD APP\bin\x86
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
c:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static
C:\Users\PavilionG4\AppData\Local\Smartbar\Application\
C:\PROGRA~2\IBM\SQLLIB\BIN
C:\PROGRA~2\IBM\SQLLIB\FUNCTION
C:\Program Files\gedit\bin
C:\Kivy-1.7.2-w32
C:\Program Files (x86)\ZBar\binj
C:\Program Files (x86)\Java\jdk1.7.0_05\bin
C:\Program Files\MATLAB\R2013a\runtime\win64
C:\Program Files\MATLAB\R2013a\bin
C:\Python27

TNS是:
C:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN\tnsnames.ora
REPORT1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.28.128.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = REPORT1)
)
)

f1.py给我显示错误
import cx_Oracle
ip = '172.25.25.42'
port = 1521
SID = 'REPORT1'
dns_tns = cx_Oracle.makedsn(ip,port,SID)
connection = cx_Oracle.connect(u"Lee",u"123",dns_tns)
cursor = connection.cursor()
connection.close()

错误
回溯(最近的调用在最前):
文件 "f1.py",第6行,
connection = cx_Oracle.connect(u"Lee",u"123",dns_tns)
cx_Oracle.InterfaceError: 无法获取Oracle环境句柄

问题
1. 如何获取Oracle环境句柄?
我在网上搜索过,但不幸的是没有找到解决我问题的答案。
2. 如何让Python使用另一个Oracle客户端,而不影响现有的客户端?

1 个回答

2

如果Python在路径中找到多个OCI.DLL文件(即使它们是一样的),就会出现这个错误。(你的路径设置看起来可能会导致找到多个文件。)你可以在你的脚本中调整路径,这样Python就只会在指定的地方寻找支持的ORACLE文件。如果你需要在本地运行多个版本的Oracle客户端,这可能是你唯一的解决办法。

撰写回答