2009-08-28 11 views
7

विंडोज़ में, ctypes.cdll.msvcrt ऑब्जेक्ट स्वचालित रूप से मौजूद है जब मैं ctypes मॉड्यूल आयात करता हूं, और यह msvcrt माइक्रोसॉफ़्ट सी ++ रनटाइम लाइब्रेरी according to the docs का प्रतिनिधित्व करता है।ctypes में msvcrt के विभिन्न संस्करण

हालांकि, मुझे लगता है कि 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 समारोह के साथ लोड कर सकते हैं के बीच का अंतर है? किस विशिष्ट परिस्थितियों में वे एक ही पुस्तकालय नहीं हो सकते हैं?

+1

संबंधित: [विंडोज़ पर पायथन में msvcrt तक पहुंचने के तरीकों के बीच मतभेद क्या हैं?] (Https://stackoverflow.com/q/30790494/4279) – jfs

उत्तर

10

यह सिर्फ इतना है कि ctypes.cdll.msvcrt स्वचालित रूप से मौजूद नहीं है, लेकिन ctypes.cdll.anything स्वचालित रूप से मौजूद है, और सबसे पहले पहुंच पर लोड किया जाता, anything.dll लोड हो रहा है। तो ctypes.cdll.msvcrt लोड msvcrt.dll, जो एक पुस्तकालय है जो विंडोज के हिस्से के रूप में जहाज है। यह सी रनटाइम नहीं है जो पाइथन लिंक करता है, इसलिए आपको msvcrt से malloc/free को कॉल नहीं करना चाहिए।

उदाहरण के लिए, पायथन 2.6/3.1 के लिए, आपको ctypes.cdll.msvcr90 का उपयोग करना चाहिए। चूंकि यह समय के साथ बदल जाएगा, find_msvcrt() आपको लाइब्रेरी का नाम देता है जिसका आपको वास्तव में उपयोग करना चाहिए (और फिर ctypes.CDLL के माध्यम से लोड करें)।

एमएससी, वीसी ++, प्लेटफार्म एसडीके, या विंडोज़: crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70 के हिस्से के रूप में विभिन्न बिंदुओं पर जारी माइक्रोसॉफ्ट सीआरटी के कुछ अलग संस्करणों के नाम यहां दिए गए हैं। डीएलएल, msvcr71.dll, msvcr80.dll, msvcr90.dll।

+0

धन्यवाद! मैंने विंडोज़-भूमि में प्रोग्रामिंग में ज्यादा समय नहीं लगाया है, इसलिए इस तरह की जानकारी बेहद उपयोगी है। –

+4

इसलिए पूर्णता के लिए - ctypes.cdll [ctypes.util.find_msvcrt()] को उचित सीआरटी में एक हैंडल वापस करना चाहिए। –

संबंधित मुद्दे