2011-08-31 15 views
11

Mam działający program Pythona 2.7, który wywołuje bibliotekę DLL. Próbuję przenieść skrypt do Pythona 3.2. Wydaje się, że wywołanie DLL działa (tzn. Nie ma błędu podczas wywoływania), ale zwrócone dane nie mają sensu.Różnice w ctypach między Pythonem 2 a 3

Na wszelki wypadek może być przydatny: - Połączenie ma trzy argumenty: dwa int (wejście) i wskaźnik do tablicy ushort (wyjście).

Próbowałem bez powodzenia używać zarówno python, jak i numpy array.

Czy ktokolwiek może wyliczyć różnice między Python 2.7 a 3.2 pod względem ctypów?

góry dzięki

EDIT

Oto przykład kodu. DLL jest własnościowy, więc nie mam kodu. Ale mam nagłówek C:

void example (int width, int height, unsigned short* pointer) 

Kod Pythona:

width, height = 40, 100 
imagearray = np.zeros((width,height), dtype=np.dtype(np.ushort)) 
image = np.ascontiguousarray(imagearray) 
ptrimage = image.ctypes.data_as(ct.POINTER(ct.c_ushort)) 
DLL.example(width, height, ptrimage) 

to działa w Pythonie 2.7, ale nie w 3.2.

EDIT 2

Jeśli zmiany w ctypes są tylko te wskazane przez Cedrica, to nie ma sensu, że Python 3.2 nie będzie działać. Patrząc ponownie na kod, stwierdziłem, że istnieje funkcja przygotowania wywoływana przed funkcją, o której wspomniałem. Podpis brzmi:

void prepare(char *table) 

W Pythonie Wołam przez:

table = str(aNumber) 
DLL.prepare(table) 

Czy to możliwe, że problem jest spowodowany zmianą manipulacji ciąg Python?

+1

Nie jestem świadom wszelkich różnic w ogóle. Myślę, że powinniśmy zobaczyć kod. –

Odpowiedz

14

W Pythonie 2.7, łańcuchy są bajtowe-strings domyślnie. W Pythonie 3.x są one domyślnie unikodowane.Spróbuj jawnie nadać ciągowi znaków ciąg bajtowy, używając .encode('ascii') przed przekazaniem go do DLL.prepare.

Edit:

#another way of saying table=str(aNumber).encode('ascii') 
table = bytes(str(aNumber), 'ascii') 
DLL.prepare(table) 
+1

Po kilku latach ta odpowiedź jest bardzo przydatna! Miałem również problem, w którym używałem starej biblioteki python w Python3 i nie mogłem zrozumieć, dlaczego kod nie działa. Po zmianie ciągów przechodzę do współdzielonej biblioteki na ascii, wszystko działało dobrze! –

0

Zgodnie z dokumentacją mysite.urls tylko zmienia się między 2,7 ​​i 3,2

nowego typu, ctypes.c_ssize_t oznacza danych typu C ssize_t.

W 2.7, to był jakiś inny modifications introduced:

Moduł ctypes teraz zawsze konwertuje Brak, aby wskaźnik C NULL dla argumentów zadeklarowanych jako wskaźniki. (Zmienione przez Thomasa Hellera, numer 4606). Bazowa biblioteka libffi została zaktualizowana do wersji 3.0.9, zawierająca różne poprawki dla różnych platform. (Aktualizacja przez Matthias Klose; problem 8142.)

nie jestem pewien, że będzie to wyjaśnić przyczynę swojego problemu ...

Powiązane problemy