cx_Oracle在Python3.9中导入失败,尽管所有的东西都经过了正确的路径,并且所有必需的部分都在64位上运行



在前面,我们有一个2.7版本的Python安装在venv中运行,它与cx_Oracle一起工作没有问题。我的任务是让一台新机器启动并运行Python 3.9,我们代码库的一个组成部分是cx_Oracle,因为这就是我们与使用的Oracle表的对话方式。

根据SQL Developer,我们的数据库如下。

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64 bit Production
Pl/SQL Release 12.2.0.1.0 - Production
CORE12.2.0.1.0Production
TNS for Linus: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

根据PyCharm,我正在我们的VENV 中运行

cx_oracle 8.2.1

我在这里看到一个条目,其中大写是一个问题,但我仔细检查了一下,当通过Anaconda导入时,在文件资源管理器中cx_Oracle是否正确大写,我认为PyCharm中的Python解释器部分只是将所有输出格式化为小写。

就Instant Client而言,我们在Python 2.7的安装中使用了12.1,但为了升级到3.9,我试图将我们带入目前的版本(也很确定12.1的安装是32位的(。两者我都试过了:

instantclient_19_12

instantclient_21_3

均使用从Oracle网站下载的64位基本版本。

每当我尝试

import cx_Oracle

我得到了可怕的

ImportError: DLL Load failed while importing cx_Oracle: The specified module could not be found.

现在我正在使用我在编写中没有输入的遗留代码,但我们的2.7安装正在使用此函数来设置PATH等。

currdirr = os.getcwd()
instantClientPath = "/instantclient_19_12/"
os.environ["PATH"] = currdir + instantClientPath+";"+os.environ["PATH"]
os.environ["ORACLE_HOME"] = instantClientPath
os.environ["LD_LIBRARY_PATH"] = instantClientPath
os.environ["TNS_ADMIN"] = instantClientPath
os.environ["NLS_LANG"] = "american_america.WE8MSWIN1252"
import cx_Oracle

以前在我们的2.7安装中,instantClientPath/instantclient_12_1/相同,被指向的文件夹位于同一父目录中。

然而,有人说,如果你使用的是cx_Oracle版本8或更高版本,你需要使用不同的方法来初始化,所以我改为尝试

import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir=r"C:Our_Python_Directoryinstantclient_19_12")

无论哪种方式,我都会得到相同的ImportError,但没有实际指示它找不到哪个.dll。从上周在谷歌上的基本生活来看,我能说的最好的事情是oci.dll有问题,但这是存在的。

此外,每个窗口。

系统类型64位操作系统,基于x64的处理器
版本Windows 10 Pro
21H1

如有任何帮助,我们将不胜感激。

我找到的解决方案。在我们以前的项目目录中,我们有一个名为cx_Oracle.pyd的文件,以及instantclient_12_1的Instant Client文件夹。只要这两件事存在,我们的目录似乎可以在我们所有的远程机器上运行,即使有问题的机器除了项目目录中的文件外,没有在venv中安装cx_Oracle或安装Instant Client。

因此,在Anaconda在venv中安装cx_Oracle的新机器上,我发现了一个名为cx_Oracle.cp39-win_amd64.pyd的文件,将该文件移动到我的项目目录中,突然允许cx_Orace识别Instant Client文件夹中的dll,我就可以毫无问题地访问我的数据库了。我不知道为什么会这样,我会试着进一步挖掘,找出原因,但我会把这个留在这里,以防其他人有类似的问题。

最新更新