2009-08-28 11 views
7

Sous Windows, l'objet ctypes.cdll.msvcrt existe automatiquement lorsque j'importe le module ctypes et représente la bibliothèque d'exécution Microsoft C++ msvcrtaccording to the docs. Cependant, je remarque qu'il y a aussi une fonction find_msvcrt qui va "return the filename of the VC runtype library used by Python".Différentes versions de msvcrt dans les types ctypes

Il indique en outre, "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."

Donc ma question est, quelle est la différence entre la bibliothèque ctypes.cdll.msvcrt que je l'ai déjà et celui que je peux charger avec la fonction find_msvcrt? Dans quelles circonstances particulières pourraient-ils ne pas être la même bibliothèque?

+1

connexes: [quelles sont les différences entre les façons d'accéder à msvcrt en python sur Windows?] (Https://stackoverflow.com/q/30790494/4279) – jfs

Répondre

10

Non seulement ctypes.cdll.msvcrt existe automatiquement, mais ctypes.cdll.anything existe automatiquement et est chargé lors du premier accès, en chargeant anything.dll. Donc, ctypes.cdll.msvcrt charge msvcrt.dll, qui est une bibliothèque livrée dans le cadre de Windows. Ce n'est pas le runtime C avec lequel Python est lié, donc vous ne devriez pas appeler le malloc/free de msvcrt. Par exemple, pour Python 2.6/3.1, vous devez utiliser ctypes.cdll.msvcr90. Comme cela va changer au fil du temps, find_msvcrt() vous donne le nom de la bibliothèque que vous devriez vraiment utiliser (et ensuite charger ctypes.CDLL).

Voici les noms de quelques versions différentes de Microsoft CRT, publiées à divers moments dans le cadre de MSC, VC++, la plate-forme SDK, ou Windows: crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70. dll, msvcr71.dll, msvcr80.dll, msvcr90.dll.

+0

Merci! Je ne passe pas beaucoup de temps à programmer dans Windows-land, donc ce genre de détail est extrêmement utile. –

+4

donc pour la complétude - ctypes.cdll [ctypes.util.find_msvcrt()] devrait retourner un handle au CRT approprié. –

Questions connexes