首页 > 解决方案 > 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,“原始”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 安装没有所需的 mingw 库后,我重写了帖子以说明这一点并(希望)澄清剩下的问题。

标签: pythonanacondactypes

解决方案


推荐阅读