2012-12-12 21 views
6

Jeśli mam zapisywalny buffer, mogę użyć funkcji ctypes.c_void_p.from_buffer, aby uzyskać wskaźnik C do tego bufora.const void * wskaźnik w ctypes

Jak radzić sobie z nieopisanymi buforami? Jak utworzyć wskaźnik const, który można przekazać do kodu C, który oczekuje const void* bez konieczności tworzenia zapisywalnej kopii niezapisanego bufora?

Rozważałem c_void_p.from_address, ale bufory (i pamięci) nie wydają się ujawniać ich adresu.


Niektóre wyjaśnienia:

>>> import ctypes 
>>> b = buffer("some data that supports the buffer interface, like a str") 
>>> ptr = ctypes.c_void_p.from_buffer(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: buffer is read-only 
>>> ptr = ctypes.c_void_p.from_buffer_copy(b) # works, but has to copy data 
>>> ptr = ctypes.CONST(c_void_p).from_buffer(b) # (I'm making this one up) 
>>> ptr = ctypes.c_void_p.from_address(???)  # could work; how to get addr? 

To by pracować z void some_api(const void* read_only_data) jak:

>>> ctypes.cdll.LoadLibrary(some_lib).some_api(ptr) 

Metoda z from_buffer_copy prace, ale musi skopiować bufor pierwszy. Szukam sposobu na obejście wymogu zapisu bufora, ponieważ nikt nie zamierza tam pisać i chcę uniknąć zbędnego kopiowania danych.

+0

Czy możesz podać przykładowy kod? – ebarr

+1

Idziemy, mam nadzieję, że teraz jest jasne – Kos

+0

Może to być przydatne http://stackoverflow.com/questions/121396/accessing-object-memory-address. Próbowałem bawić się z sugestiami, ale z ograniczonym sukcesem. Podstęp jest najprawdopodobniej napisać funkcję PythonC_API, aby wziąć bufor i zwrócić jego adres. To powinno być stosunkowo łatwe do zrobienia. – ebarr

Odpowiedz

0

Możesz odrzucić ciąg znaków Python do char* z ctypes, a to wskazuje na rzeczywistą pamięć tam przechowywane są dane ciągu Python.

Zapraszam do podwójnego rzutu.

Powiązane problemy