हेलो,पायथन संदर्भ गणना और ctypes
मुझे पाइथन संदर्भ गणना को समझने में कुछ परेशानी है। मैं जो करना चाहता हूं वह cty+ मॉड्यूल का उपयोग कर C++ से पायथन तक एक टुपल लौटाता है।
सी ++:
PyObject* foo(...)
{
...
return Py_BuildValue("(s, s)", value1, value2);
}
पायथन:
pointer = c_foo(...) # c_foo loaded with ctypes
obj = cast(pointer, py_object).value
मैं obj के रेफरी गिनती के बारे में निश्चित नहीं था, इसलिए मैं sys.getrefcount()
की कोशिश की और 3
मिला है। मुझे लगता है कि यह 2
होना चाहिए (getrefcount
फ़ंक्शंस स्वयं को एक रेफरी बनाता है)।
अब मैं C++ में वापसी से पहले Py_DECREF()
नहीं बना सकता क्योंकि वस्तु हटा दी जाती है। क्या मैं अजगर में रेफरी गिनती कम कर सकता हूं?
संपादित रेफरी गिनती के लिए क्या होता है जब डाली समारोह कहा जाता है? मैं नीचे दिए गए दस्तावेज से वास्तव में निश्चित नहीं हूं। http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast (obj, प्रकार) इस समारोह डाली ऑपरेटर सी में यह जो obj रूप में एक ही स्मृति ब्लॉक के लिए अंक प्रकार का एक नया उदाहरण देता है के समान है। प्रकार एक सूचक प्रकार होना चाहिए, और obj एक ऑब्जेक्ट होना चाहिए जिसे पॉइंटर के रूप में व्याख्या किया जा सकता है।
लेकिन आप एक पायथन-सी मॉड्यूल सही बनाते हैं? मैं इसे छोड़ना चाहता था और ctypes के साथ आप बस 'ctypes.cdll.LoadLibrary ('some.so')' कर सकते हैं। तो वापसी प्रकार हैंडलिंग अलग है। Ctypes के साथ यह 'ctypes.py_object' है। फिर मैं कास्ट फ़ंक्शन का उपयोग करता हूं और मुझे यकीन नहीं है कि कैसे रेफरी गिनती सही तरीके से संभाली जाती है। मेरा संपादन देखें। – tauran
हां वास्तव में, यह थोड़ा और जटिल हो सकता है ... मैंने कास्ट के कोड स्रोत को पढ़ने की कोशिश की() लेकिन मेरे पास निवेश करने के लिए पर्याप्त समय नहीं था। मैं एक नज़र डालने की कोशिश करूंगा जब मेरे पास पर्याप्त समय होगा और मेरा जवाब संपादित करें यदि मुझे कुछ ऐसा लगता है जो साबित करता है कि सीटीपीएस स्वामित्व लेता है (यदि यह मामला है, तो शायद आपको इन समस्याओं को खत्म करने के लिए सीधे एक पायथन-सी ऑब्जेक्ट बनाने पर विचार करना चाहिए यह काफी आसान है क्योंकि आप पहले से ही PyObject के साथ काम कर रहे हैं) – ThR37