cx_Oracle 无法在 Python 3.9 中导入,尽管一切都已正确路径并且所有必需的部分都在 64 位上运行

Posted

技术标签:

【中文标题】cx_Oracle 无法在 Python 3.9 中导入,尽管一切都已正确路径并且所有必需的部分都在 64 位上运行【英文标题】:cx_Oracle is failing to import in Python 3.9, despite everything being pathed properly and all requisite parts running on 64bit 【发布时间】:2021-12-27 18:49:07 【问题描述】:

首先,我们在 venv 中运行了 2.7 的 Python 安装,与 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 Interpreter 部分只是将所有输出格式化为小写。

就 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_Directory\instantclient_19_12")

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

另外,每个 Windows。

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

任何帮助将不胜感激,谢谢。

【问题讨论】:

您是否安装了您的 Instant Client 版本所需的 VS Redistributable? 我相信这个版本需要2017我的机器有两个2015-2019的副本......这是我第一次看到这样的多年版本,但我找不到任何东西如果那是 2017 年,还是我明确需要 2017 年。 尝试安装 vc redist 2017,安装程序告诉我我的机器已经有了它,所以我猜 2015-2019 确实涵盖了它,至少在微软看来。 将环境变量DPI_DEBUG_LEVEL设置为64,然后重试操作。在您的问题中发布输出。 也值得尝试 12.1 安装,您知道它适用于 Python 2.7。这同样适用于 Python 3.9。 【参考方案1】:

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

于是在venv中Anaconda安装cx_Oracle的位置的新机器上,我找到了一个叫cx_Oracle.cp39-win_amd64.pyd的文件,把这个文件移到我的项目目录下,突然让cx_Oracle能够识别Instant Client文件夹中的dll ,并且我能够毫无问题地访问我的数据库。我不知道为什么会这样,我会尝试进一步挖掘以找出原因,但我将把它留在这里以防其他人遇到类似问题。

【讨论】:

以上是关于cx_Oracle 无法在 Python 3.9 中导入,尽管一切都已正确路径并且所有必需的部分都在 64 位上运行的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Apple M1 上安装 python lib 'coremltools' - Python 3.9 版

无法在 PyCharm 中安装 PyTorch(Python 3.9 / macOS)

Python3+Django1.10+mysqlclient1.3.9:无法保存表情符号

无法在 OSX / Python 3.9 上安装 pyarrow:这是我还是不兼容的包?

Python cx_Oracle。用 executemany() 敲头

为啥 python 使用 3.8.1 和 3.9,然后无法安装包(错误:包 pkg 需要不同的 Python:3.8.1 不在 '>=3.9.0' 中)?