2011-08-31 2 views
11

나는 DLL을 호출하는 Python 2.7 프로그램이있다. 스크립트를 파이썬 3.2로 이식하려고합니다. DLL 호출이 작동하는 것 같습니다 (즉, 호출시 오류가 없음).하지만 반환 된 데이터는 의미가 없습니다.파이썬 2와 3 사이 ctypes의 차이점

유용 할 수 있습니다. -이 호출에는 int (입력)와 ushort 배열 (출력)에 대한 포인터라는 두 개의 인수가 사용됩니다.

저는 파이썬과 numpy 배열을 모두 사용하지 않고 시도했습니다.

누구나 ctypes를 존중하는 Python 2.7과 3.2의 차이점을 열거 할 수 있습니까? 사전

편집 여기

에서

덕분에 몇 가지 예제 코드입니다. DLL에는 코드가 없으므로 프로피 멘터 리입니다.

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

파이썬 코드는 다음과 같습니다 :

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) 

이 파이썬 2.7에서 작동하지만 3.2하지만 난 C 헤더가 않습니다. 하는 ctypes의 변화 만 세드릭 지적을하는 경우

편집 2

, 그것은 3.2이 작동하지 않습니다 파이썬 이해가되지 않습니다. 그래서 코드를 다시 살펴보면서, 내가 언급 한 함수 앞에 호출 된 준비 함수가 있음을 발견했습니다. 서명은 다음과 같습니다 문제가 파이썬 문자열 처리의 변화에 ​​기인한다는 것이 가능

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

: 파이썬에서

void prepare(char *table) 

, 나는에 의해 호출 무엇입니까?

+1

나는 전혀 차이 잘 모르는 것 같아요. 나는 우리가 약간의 코드를 볼 필요가 있다고 생각한다. –

답변

14

(문제 8142.을 마티아스 클로제에 의해 업데이트). Python 3.x에서는 기본적으로 유니 코드입니다.명시 적으로 문자열을 .encode('ascii')을 사용하여 바이트 문자열로 지정하고 DLL.prepare으로 전달하십시오.

편집 :

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

몇 년 동안이 대답은 매우 유용합니다! 또한 Python3에서 오래된 파이썬 라이브러리를 사용하고 코드가 작동하지 않는 이유를 이해할 수없는 문제가있었습니다. 공유 라이브러리에 전달한 문자열을 ascii로 변경 한 후 모든 것이 잘 수행되었습니다! –

0

파이썬 문서에 따르면, 단지 변경

새로운 타입

2.7 내지 3.2 ctypes.c_ssize_t는 C ssize_t의 데이터 유형을 나타낸다.

2.7에서, 다른 modifications introduced이 있었다 :

하는 ctypes 모듈은 이제 항상 포인터로 선언 인수에 대한 C의 NULL 포인터에 없음을 변환하지 않습니다. (변경 내용 : Thomas Heller, 발행 번호 4606) 기본 libffi 라이브러리는 3.0.9 버전으로 업데이트되었으며 각 플랫폼마다 다양한 수정이 포함되어 있습니다. 문자열은 기본적으로 바이트 문자열, ... 나는 그것이 문제의 원인을 설명 할 것입니다 확실하지 않다

파이썬 2.7에서