في Python، كيفية الوصول إلى مجموعة UINT16 [3] ملفوفة بواسطة Swig (أي Unwapap a pyswigobject)؟

StackOverflow https://stackoverflow.com/questions/2209395

  •  18-09-2019
  •  | 
  •  

سؤال

هذا هو سؤال بيثون. لدي متغير

>>> A
<Swig Object of type 'uint16_t *' at 0x8c66fa0>

>>> help(A)
class PySwigObject(object)
  Swig object carries a C/C++ instance pointer

والمثيل الذي يشير إليه A هو صفيف متجاور UINT16 [3] والمشكلة هي الوصول إلى هذه الصفيف من Python.

في بيثون، كيف يمكنني إنشاء متغير ب من الطول 3، وهذا يعطيني الوصول للقراءة / الكتابة إلى نفس الذاكرة المدببة بواسطة المؤشر ملفوفة في أ؟

أعتقد أن المشكلة لديها جزأين:

  1. كيفية الحصول على المؤشر خارج A. (أعتقد أن 0x8c66fa0 يشير إلى كائن SWIJ، وليس الكائن الملفوف).
  2. كيفية الوفارة نوعا ما من صفيف بيثون باستخدام مؤشر الذاكرة ونوع بيانات معروف. (Numpy يحتوي على طريقة فروم، ولكن ما يبدو أن هناك حاجة هي طريقة من الأمثل.) ربما تكون هناك حاجة إلى بعض الصب.

يجب أن يكون هذا سهلا وأعتقد، لكنني كنت أقرأ واخترق لأكثر من يوم!

لحل الجزء الثاني، أعتقد أن مثال يمكن أن يبدأ بهذه الطريقة:

>>> import numpy
>>> C = numpy.ascontiguousarray([5,6,7],"uint16")
>>> C
array([5, 6, 7], dtype=uint16)
>>> C.data
<read-write buffer for 0x8cd9340, size 6, offset 0 at 0x8902f00>

ثم حاول إنشاء B (من أي نوع من نوع Vector) باستخدام "0x8902f00" و "UINT16" واختبار ما إذا كان تغيير B [2] يتسبب في تغييرات في C [2].

شكرا جزيلا لاقتراحاتك أو مثال واضح.

يعتبر،

أوين

هل كانت مفيدة؟

المحلول

بعد المزيد من القراءة ومحاولة الاشياء، تكون الإجابات كما يلي:

1. مؤشر ملفوفة في pyswigobject a متاح ك __ .__ طويل __ (). 2. يمكن إلقاء مؤشر خام في نوع فهرسة باستخدام ctypes كما يلي استيراد ctypes pa = ctypes.ast (a .__ طويل __ ()، ctypes.pointer (ctypes.c_uint16))

ثم يمكن معالجة العناصر كما PA [0]، PA [1] إلخ

تشير PA إلى نفس الذاكرة مثل الكائن الأصلي، وبالتالي توخي الحذر عدم استخدام PA بعد حذف الكائن الأصلي.

هنا مثال على الجزء الثاني فقط من المشكلة (عند استخدام المؤشر الخام من النوع المعروف في ثيثون)،

C = numpy.ascontiguousarray([5,6,7],"uint16")  # make an array
C
rawPointer = C.ctypes.data
pC = ctypes.cast( rawPointer, ctypes.POINTER( ctypes.c_uint16 ))
pC[0:3]
pC[1]=100
pC[0:3]
C

تشغيل المثال في Python سيظهر أن كلا C [1] والكمبيوتر [1] تم تغييره إلى 100.

تم حلها. :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top