2012-01-16 13 views
6

द्वारा लौटाए गए एक पाइथन स्ट्रिंग में कास्टिंग [] एक सी स्टाइल कॉन्स चार [] स्ट्रिंग पॉइंटर (डीएलएल से लौटाया गया) को पाइथन संगत स्ट्रिंग प्रकार में डालने का प्रयास कर रहा है। लेकिन जब Python27 कार्यान्वित:एक डीएलएल

import ctypes 

charPtr = ctypes.cast("HiThere", ctypes.c_char_p) 
print("charPtr = ", charPtr) 

हम पाते हैं: charPtr = c_char_p('HiThere')

शायद कुछ ठीक से मूल्यांकन कर जा करने के लिए नहीं है। मेरे प्रश्न हैं:

  1. इस charPtr को वापस पाइथन संगत, प्रिंट-सक्षम स्ट्रिंग में कैसे डालना चाहिए?
  2. कास्ट ऑपरेशन अभी उल्लेख किया गया है कि यह क्या करना चाहिए?

उत्तर

9

ctypes.cast() का उपयोग एक प्रकार के उदाहरण को किसी अन्य प्रकार के डेटाटाइप में बदलने के लिए किया जाता है। आपको इसे पायथन स्ट्रिंग में बदलने के लिए इसकी आवश्यकता नहीं है। इसे पायथन स्ट्रिंग में प्राप्त करने के लिए बस ".value" का उपयोग करें।

>>> s = "Hello, World" 
>>> c_s = c_char_p(s) 
>>> print c_s 
c_char_p('Hello, World') 
>>> print c_s.value 
Hello, World 

अधिक जानकारी here

+0

हाँ:

यहाँ एक उदाहरण सी क्रम बुला time और ctime कार्यों है। मैंने थोड़ा संपादित किया। मैं ठीक से अद्यतन कर रहा हूँ। –

5

आप ctypes कार्यों का argtypes या restype गुण सेट करते हैं, वे एक डाली की आवश्यकता के बिना सही अजगर वस्तु वापस आ जाएगी।

>>> from ctypes import * 
>>> m=CDLL('msvcrt') 
>>> t=c_long(0) 
>>> m.time(byref(t)) 
1326700130 
>>> m.ctime(byref(t)) # restype not set 
6952984 
>>> m.ctime.restype=c_char_p # set restype correctly 
>>> m.ctime(byref(t)) 
'Sun Jan 15 23:48:50 2012\n' 
+0

क्या पाइथन लौटाए गए चार * के जीवन चक्र का प्रबंधन करता है? –

+0

@ हेलीनवंग नहीं, यह नहीं है। इस मामले में 'ctime' स्थिर स्मृति में एक सूचक देता है इसलिए प्रबंधन करने के लिए कुछ भी नहीं है। –

+0

क्या आप सामान्य मामले के बारे में जानते हैं? : सी पुस्तकालय ढेर पर आवंटित स्मृति लौटा दी। –

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