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 ध्वज सेट। मेरी समझ के लिए, दस्तावेज गलत है; सरणी बफर इंटरफ़ेस का समर्थन नहीं करता है।
मैं बफर इंटरफ़ेस का समर्थन करने वाले बाइटियर का उपयोग कर सकता हूं, समस्या यह है कि मुझे एक बफर में पढ़ने के लिए सरणी की व्यावहारिक सेफाइल() विधि की आवश्यकता है जिसे मैं अपने सी/सी ++ कोड में उपयोग कर सकता हूं।
क्या कोई विकल्प है जो मुझे एक बफर में फ़ाइल पढ़ने और सी कोड से इस बफर का उपयोग करने की अनुमति देगा, और स्मृति प्रतियों को शामिल नहीं करेगा? (मैं बड़ी बाइनरी फाइलों का इलाज करना चाहता हूं और कॉपी करना एक कम वांछनीय विकल्प है)।
सहमत हुए, जैसा कि मैंने अपने प्रश्न में कहा था। लेकिन ... bytearray में आसान सेफाइल विधि नहीं है। मुझे लगता है कि मैं अपने द्विआधारी डेटा का प्रतिनिधित्व करने के लिए एक स्ट्रिंग ऑब्जेक्ट का उपयोग कर सकता हूं, लेकिन एक बफर (जैसे बाइटियर) को जानना फाइल से भरा जा सकता है, मेरे विकल्पों का विस्तार करता है। एक स्ट्रिंग का यूनिकोड कोने केस भी है जो समाप्त हो जाएगा यदि मैं एक और बफर प्रकार का उपयोग कर सकता हूं। – David
बग रिपोर्ट यहां है: http://bugs.python.org/issue17145 – mpb