2011-02-02 6 views
6

python documentation on array स्पष्ट रूप से बताता है कि सरणी बफर इंटरफ़ेस के अनुरूप है। यह भी buffer_info() विधि का उपयोग नहीं करने का सुझाव है। लेकिन जब मैं PyObject_GetBuffer() के साथ C/C++ कोड से Py_Buffer प्राप्त करने का प्रयास करता हूं या पायथन के मेमोरीव्यू का उपयोग करता हूं, तो मुझे विफलता मिलती है।एक सरणी ऑब्जेक्ट से Py_buffer प्राप्त करना क्यों संभव नहीं है?

>>> a = array.array('c') 
>>> memoryview(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: cannot make memory view because object does not have the buffer interface 

वास्तव में, जब मैं अजगर के कोड बेस खोज, केवल bytearrayobject (bytearray), memoryobject (memoryview), और stringobject (एसटीआर) है:

उदाहरण के लिए, अजगर में (मैं संस्करण 2.7 का उपयोग करें) उन पर आवश्यक Py_TPFLAGS_HAVE_NEWBUFFER ध्वज सेट। मेरी समझ के लिए, दस्तावेज गलत है; सरणी बफर इंटरफ़ेस का समर्थन नहीं करता है।

मैं बफर इंटरफ़ेस का समर्थन करने वाले बाइटियर का उपयोग कर सकता हूं, समस्या यह है कि मुझे एक बफर में पढ़ने के लिए सरणी की व्यावहारिक सेफाइल() विधि की आवश्यकता है जिसे मैं अपने सी/सी ++ कोड में उपयोग कर सकता हूं।

क्या कोई विकल्प है जो मुझे एक बफर में फ़ाइल पढ़ने और सी कोड से इस बफर का उपयोग करने की अनुमति देगा, और स्मृति प्रतियों को शामिल नहीं करेगा? (मैं बड़ी बाइनरी फाइलों का इलाज करना चाहता हूं और कॉपी करना एक कम वांछनीय विकल्प है)।

उत्तर

3

memoryview केवल उन ऑब्जेक्ट्स पर काम करता है जो पायथन 3 बफर इंटरफ़ेस का समर्थन करते हैं। पाइथन 3 में array.array करता है, लेकिन यह पायथन 2.7 में नहीं है। आप इसके लिए एक बग रिपोर्ट दर्ज करना चाहेंगे। बस उपयोग करें bytearray (या str यदि आप इसे केवल पढ़ने के लिए उपयोग कर रहे हैं) का उपयोग करें। दोनों समर्थन memoryview बस ठीक है।

+0

सहमत हुए, जैसा कि मैंने अपने प्रश्न में कहा था। लेकिन ... bytearray में आसान सेफाइल विधि नहीं है। मुझे लगता है कि मैं अपने द्विआधारी डेटा का प्रतिनिधित्व करने के लिए एक स्ट्रिंग ऑब्जेक्ट का उपयोग कर सकता हूं, लेकिन एक बफर (जैसे बाइटियर) को जानना फाइल से भरा जा सकता है, मेरे विकल्पों का विस्तार करता है। एक स्ट्रिंग का यूनिकोड कोने केस भी है जो समाप्त हो जाएगा यदि मैं एक और बफर प्रकार का उपयोग कर सकता हूं। – David

+2

बग रिपोर्ट यहां है: http://bugs.python.org/issue17145 – mpb

2

पायथन 2.6+ में दो अलग-अलग बफर इंटरफ़ेस हैं, जैसे कि इसमें दो अलग-अलग वर्ग प्रकार हैं: क्लासिक संस्करण और पायथन 3 संस्करण।

Python/C API Reference Manual से:

दो वस्तुओं है कि बफर इंटरफ़ेस का समर्थन का उदाहरण तार और सरणियों कर रहे हैं। स्ट्रिंग ऑब्जेक्ट बफर इंटरफ़ेस के बाइट-उन्मुख रूप में वर्ण सामग्री को उजागर करता है। एक सरणी पुरानी शैली बफर इंटरफ़ेस के माध्यम से केवल अपनी सामग्री का पर्दाफाश कर सकती है। यह सीमा पायथन 3 पर लागू नहीं होती है, जहां मेमोरीव्यू ऑब्जेक्ट्स को सरणी से भी बनाया जा सकता है।

अजगर 2.7 कोड में, आप buffer समारोह का उपयोग कर पुरानी शैली बफ़र्स, और नई शैली बफ़र्स memoryview का उपयोग कर के साथ काम कर सकते हैं। पायथन 3 केवल उत्तरार्द्ध का समर्थन करता है।

पायथन 2 सी एपीआई में एक समान भेद मौजूद है; PyObject_GetBuffer नए बफर इंटरफ़ेस के लिए है, PyBuffer_FromObject/PyBuffer_FromReadWriteObject पुराने बफर इंटरफ़ेस के लिए है (और सरणी के लिए काम करना चाहिए)। अधिक जानकारी के लिए उपरोक्त लिंक देखें।

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