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,“原始”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 库后,我重写了帖子以说明这一点并(希望)澄清剩下的问题。
解决方案
推荐阅读
- ios - 我如何每天奖励用户?
- c++ - 开发“Windows C/C++ 桌面应用程序”以将 Windows10 连接到蓝牙 5.0 设备时出现问题
- python - 当我使用 collidepoint() 时,我的 pygame 窗口显示“没有响应”
- bash - 意外标记'('bash附近的语法错误
- node.js - “请求”类型上不存在属性“用户”
>' - c# - 使用 C# Fluent Assertions 比较具有不同大小的相同 DTO 列表
- django - 模板中的 Django TemplateDoesNotExist
- c++ - 如果我使用显式实例化,这是正确的编译方法吗?
- python-3.x - 在python中使用多处理生成数组列表
- rest - 使用 pnp sp 时如何从 Principal Id 中找出名称?