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' 中)?