CDLL()可以从anaconda python安装中工作,但不能从“原始”python安装中工作

2024-09-28 16:56:21 发布

您现在位置: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___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的CType无法找到要加载dll所依赖的mingw库。尽管这些库位于工作目录中(或者明确地将它们的文件夹添加到路径中)(在使用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能够在工作目录和路径中查找dll,而“原始”python安装的ctypes不能这样做

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

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

因此,我的问题是:

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

编辑:在发现“原始”python安装没有所需的mingw库之后,我重写了这篇文章来解释这一点,并(希望)澄清剩下的问题


Tags: orgimport路径版本目录文件夹rawanaconda