2012-12-12 59 views
6

यदि मेरे पास एक लिखने योग्य buffer है, तो मैं इस बफर में सी पॉइंटर प्राप्त करने के लिए ctypes.c_void_p.from_buffer फ़ंक्शन का उपयोग कर सकता हूं।कॉन्स void * ctypes में सूचक

हालांकि गैर-लिखने योग्य बफर से निपटने के लिए कैसे? const पॉइंटर कैसे बनाएं जो मैं सी कोड को पास कर सकता हूं जो गैर-लिखने योग्य बफर की लिखने योग्य प्रतिलिपि बनाने के बिना const void* की अपेक्षा करता है?

मुझे c_void_p.from_address माना जाता है लेकिन बफर (और मेमोरीव्यू) उनके पते का खुलासा नहीं कर रहे हैं।


कुछ स्पष्टीकरण:

>>> import ctypes 
>>> b = buffer("some data that supports the buffer interface, like a str") 
>>> ptr = ctypes.c_void_p.from_buffer(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: buffer is read-only 
>>> ptr = ctypes.c_void_p.from_buffer_copy(b) # works, but has to copy data 
>>> ptr = ctypes.CONST(c_void_p).from_buffer(b) # (I'm making this one up) 
>>> ptr = ctypes.c_void_p.from_address(???)  # could work; how to get addr? 

कि void some_api(const void* read_only_data) तरह से काम करेगा:

>>> ctypes.cdll.LoadLibrary(some_lib).some_api(ptr) 

विधि from_buffer_copy के साथ काम करता है, लेकिन पहले बफर कॉपी की जरूरत है। मैं बफर की लिखने की आवश्यकता के आसपास काम करने के लिए रास्ता तलाश रहा हूं, क्योंकि कोई भी वहां लिखने वाला नहीं है और मैं डेटा की अनावश्यक प्रतिलिपि से बचना चाहता हूं।

+0

क्या आप कुछ उदाहरण कोड दे सकते हैं? – ebarr

+1

वहां हम जाते हैं, मुझे उम्मीद है कि यह अब स्पष्ट है – Kos

+0

तो यह उपयोगी हो सकता है http://stackoverflow.com/questions/121396/accessing-object-memory-address। मैंने इसमें सुझावों के साथ खेलने की कोशिश की है, लेकिन सीमित सफलता के साथ। यह चाल बफर लेने और अपना पता वापस करने के लिए एक पायथन सी_एपीआई फ़ंक्शन लिखने की अधिक संभावना है। यह करना अपेक्षाकृत आसान होना चाहिए। – ebarr

उत्तर

0

आप पाइथन स्ट्रिंग को char* पर ctypes के साथ डालें, और यह वास्तविक स्मृति को इंगित करता है कि पाइथन स्ट्रिंग डेटा संग्रहीत किया जाता है।

डबल-कास्ट करने के लिए स्वतंत्र महसूस करें।