关于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安装没有所需的mingw库之后,我重写了这篇文章来解释这一点,并(希望)澄清剩下的问题
目前没有回答
相关问题 更多 >
编程相关推荐