Hallo,Số tham chiếu Python và ctypes
Tôi có một số khó khăn khi hiểu số tham chiếu python. Điều tôi muốn làm là trả về một bộ tuple từ C++ sang python bằng cách sử dụng mô-đun ctypes.
C++:
PyObject* foo(...)
{
...
return Py_BuildValue("(s, s)", value1, value2);
}
Python:
pointer = c_foo(...) # c_foo loaded with ctypes
obj = cast(pointer, py_object).value
Tôi đã không chắc chắn về số lượng ref của obj, vì vậy tôi cố gắng sys.getrefcount()
và có 3
. Tôi nghĩ rằng nó phải là 2
(các chức năng getrefcount
làm cho một ref chính nó).
Bây giờ tôi không thể thực hiện Py_DECREF()
trước khi trở về trong C++ vì đối tượng bị xóa. Tôi có thể giảm số lượng ref trong python không?
chỉnh sửa gì xảy ra với số lượng ref khi chức năng dàn diễn viên được gọi là? Tôi không thực sự chắc chắn từ tài liệu dưới đây. http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast (obj, type) Chức năng này cũng tương tự như các nhà điều hành dàn diễn viên trong C. Nó trả về một thể hiện mới của loại mà chỉ vào khối bộ nhớ giống như obj. loại phải là kiểu con trỏ và obj phải là đối tượng có thể được hiểu là con trỏ.
Nhưng bạn tạo mô-đun python-c phải không? Tôi muốn bỏ qua và với ctypes bạn chỉ có thể 'ctypes.cdll.LoadLibrary ('some.so')'. Vì vậy, việc xử lý kiểu trả về là khác nhau. Với ctypes nó là 'ctypes.py_object'. Sau đó, tôi sử dụng chức năng cast và tôi không chắc chắn cách tính ref được xử lý đúng cách. Xem chỉnh sửa của tôi. – tauran
Có thực sự, có thể phức tạp hơn một chút ... Tôi đã cố gắng đọc mã nguồn của diễn viên() nhưng tôi không có đủ thời gian để investiagte đúng cách. Tôi sẽ cố gắng xem xét khi nào tôi sẽ có đủ thời gian và chỉnh sửa câu trả lời nếu tôi tìm thấy thứ gì đó chứng minh rằng ctypes có quyền sở hữu (nếu là như vậy, có lẽ bạn nên xem xét việc tạo trực tiếp đối tượng python-c để loại bỏ những vấn đề này Điều đó khá dễ dàng vì bạn đã làm việc với PyObject) – ThR37