微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ctypes.CDLL() 可从 anaconda python 安装运行,但不能从“原始”python 安装运行

如何解决ctypes.CDLL() 可从 anaconda python 安装运行,但不能从“原始”python 安装运行

我有一个关于 ctypes 的使用的奇怪问题: ctypes 的行为取决于我是使用 anaconda 的 python 安装还是 python.org 的“原始”python 安装(均在 Windows 10 上)。

复制:只需转到 anaconda.com,通过认安装程序安装 anaconda(和 anaconda python)。转到 python.org 并通过认安装程序安装 python。

anaconda 安装附带了 mingw(x64) 二进制文件,这些文件至少是一些 .dll 所需的(我在这里不太了解,但至少我正在使用的 dll 需要它们)。 “原始”python 没有这些,因此需要手动添加它们(需要部分或全部(未检查):libatomic-1.dll、libgccc_s_seh-1.dll、libgomp-1.dll、libquadmath- 0.dll、libssp-0.dll、libstdc++-6.dll、libwinpthread-1.dll,只需将它们复制到您正在工作的目录中或将它们的目录添加到PATH)。

现在您有两个版本的 python,每个版本都有自己的 ctypes 版本(我的 anaconda python 版本为 3.8.8,“raw”python 版本为 3.9.5,ctypes 版本均为 1.1.0)。>

尝试通过 anaconda python 加载 dll,例如:

import ctypes
dll = ctypes.CDLL(<insertdllname>)

完全没问题(前提是你在dll的目录下工作,否则你需要指定完整路径)。

尝试相同的“原始”python 安装失败。问题是来自“原始”python 的 ctypes 找不到要加载的 dll 所依赖的 mingw 库。尽管这些库位于工作目录中(或明确地将它们的文件添加到 PATH)(两者都在使用 anaconda python 时工作)。仅当将附加库放入 python 安装文件夹(“python.exe”所在的位置)时,才会找到它们。

现在,当我将 ctypes 文件夹从 anaconda 安装复制到“raw”安装的 ctypes 文件夹所在的位置(将 ctypes 从“raw”安装重命名为 ctypes_raw)时,我有两个版本的 ctypes 可用。

使用:

import ctypes_roh
ctypes_roh.CDLL(<insertdllname>)

失败,如上。

import ctypes
ctypes.CDLL(<insertdllname>)

有效,所以显然两个 ctypes 库是不同的,anaconda 安装中的 ctypes 能够在工作目录和 PATH 中查找 dll,而“原始”python 安装中的 ctypes 不能这样做。

import ctypes
import ctypes_raw
ctypes.CDLL(<insertdllname>)
ctypes_raw.CDLL(<insertdllname>)

现在两个调用都有效。显然,从 anaconda ctypes 调用 CDLL 修复了阻止 CDLL 从“原始”ctypes 在工作目录或 PATH 中查找 dll 的任何问题。

所以我的问题是:

  • python anaconda 安装中的 ctypes 和 python.org 中的“原始”python 安装中的 ctypes 是否应该不同?
  • 有什么区别?为什么来自“原始”python 的 ctypes 无法在工作目录或 PATH 中查找 dll?为什么从 anaconda python 调用 ctypes 会“修复”这个问题?

编辑:在发现“原始”python 安装没有所需的 mingw 库后,我重写了帖子以说明这一点并(希望)澄清剩余的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。