2011-08-31 26 views
11

Bir DLL çağıran bir çalışma python 2.7 programım var. Ben betiği python 3.2'ye aktarmaya çalışıyorum. DLL çağrısı çalışıyor gibi görünüyor (yani arama sırasında hata yok), ancak döndürülen veriler anlamlı değil.Python 2 ve 3 arasındaki klişelerdeki farklar

Sadece aşağıdaki durumlarda yararlı olabilir: - Arama üç argüman alır: iki int (giriş) ve bir ushort dizisine (çıkış) bir işaretçi.

Hem python hem de numpy dizilerini başarıyla kullanmayı denedim.

Python 2.7 ve 3.2 arasındaki farklar kimseye saygılı sayılabilir mi? peşin

DÜZENLEME İşte

yılında

sayesinde bazı örnek kodudur. DLL, bu yüzden kodu yok ben tesirli.

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

piton kodudur:

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) 

Bu piton 2.7 çalışır ancak 3.2 Ama C başlığını var. ctypes değişiklikler yalnızca Cedric tarafından işaret ise

DÜZENLEME 2

, bu 3.2 çalışmaz python mantıklı değil. Bu yüzden tekrar kodlara baktığımda, söz ettiğim işlevden önce çağrılan bir hazırlık işlevi olduğunu gördüm. imzadır: Sorun Python dize işleme değişikliği kaynaklandığını mümkün mü

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

: python'da

void prepare(char *table) 

, ben tarafından çağırıyorum?

+1

Ben hiç bir farkların farkında değilim. Bazı kodları görmemiz gerektiğini düşünüyorum. –

cevap

14

(sorunu 8142. Matthias Klose tarafından güncellendi). Python 3.x'te, varsayılan olarak unicode'turlar.DLL.prepare'a göndermeden önce dizginizi .encode('ascii') kullanarak bir bayt dizesini açıkça oluşturmayı deneyin.

Düzenleme:

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

Birkaç yıl içinde, bu cevap çok yararlı! Ayrıca Python3'te eski bir python kütüphanesi kullandığım ve kodun neden çalışmadığını anlayamadığım bir sorun vardı. Dizeleri değiştirdikten sonra ascii olmak için paylaşımlı kütüphaneye geçiyorum, her şey yolunda gitti! –

0

piton belgelerine göre, sadece değişiklikleri

yeni bir tür

2.7 ila 3.2, ctypes.c_ssize_t Cı ssize_t veri türü temsil eder.

2.7, bazı diğer modifications introduced vardı:

ctypes modülü şimdi hep işaretçiler olarak ilan argümanlar için bir C NULL pointer için Yok dönüştürür. (Thomas Heller tarafından değiştirildi; sayı 4606.) Temel libffi kitaplığı, farklı platformlar için çeşitli düzeltmeler içeren 3.0.9 sürümüne güncellendi. dizeleri varsayılan olarak bayt dizeleri, ... Ben senin sorunun nedenini açıklayacağız emin değilim

Python 2.7 olarak

İlgili konular