在Windows中,导入ctypes模块时ctypes.cdll.msvcrt
对象自动存在,它代表msvcrt
Microsoft C ++运行时库according to the docs。
但是,我注意到还有一个find_msvcrt函数"return the filename of the VC runtype library used by Python"
。
它进一步指出,"If you need to free memory, for example, allocated by an extension module with a call to the free(void *), it is important that you use the function in the same library that allocated the memory."
所以我的问题是,我已经拥有的ctypes.cdll.msvcrt
库和我可以使用find_msvcrt
函数加载的库之间有什么区别?在什么具体情况下他们可能不是同一个图书馆?
答案 0 :(得分:10)
ctypes.cdll.msvcrt
不仅自动存在,而且ctypes.cdll.anything
自动存在,并在第一次访问时加载,加载anything.dll
。因此ctypes.cdll.msvcrt
加载msvcrt.dll
,这是一个作为Windows一部分提供的库。它不是Python链接的C运行时,因此您不应该从msvcrt
调用malloc / free。
例如,对于Python 2.6 / 3.1,您应该使用ctypes.cdll.msvcr90
。由于这会随着时间的推移而发生变化,find_msvcrt()
会为您提供您应该使用的库的名称(然后通过ctypes.CDLL
加载)。
以下是Microsoft CRT的几个不同版本的名称,作为MSC,VC ++,平台SDK或Windows的一部分在各个点发布:crtdll.dll,msvcrt.dll,msvcrt4.dll,msvcr70.dll ,msvcr71.dll,msvcr80.dll,msvcr90.dll。