2014-06-13 4 views
0

파이썬 3 환경에서 C++ 라이브러리를 실행하기 위해 Cython을 사용하려고합니다. 나는이 같은 파이썬으로 다시 int 배열을 반환 할 때 :C 배열을 파이썬 바이트로 변환

def readBytes(self, length): 
    cdef int *buffer = [] 
    self.stream.read(buffer, length) 
    return buffer 

나는 오류를

return buffer 
       ^
Cannot convert 'int *' to Python object 

P.S.를 얻을 수 사이 썬들이 거의 같은이고 빨리 할 수 ​​있다고 생각하기 때문에 내가 자동으로 bytes 강제 변환 할 수 있습니다

cdef char *buffer = '' 
+0

stream.read()는'buffer'가 가리키는 메모리를 할당합니다. 이 경우 C++ 공간에 할당 된 파이썬 공간 데이터로 돌아갈 수 없습니다. – gg349

+0

@flebool 어떻게 char에서 작동합니까? –

+0

여기에 머무르기에는 너무 짧음 – gg349

답변

0

char를 사용하는 경우 나 에러가 발생하지 않습니다. char * 포인터는 기본적으로 null로 종료됩니다.

int *에 대해서는 구현되지 않았습니다. 일반적으로 coerce to a Numpy object (실제로 배열을 래핑)이 필요합니다. 더 빠른 것을 원하면 cpython.array에 대해 생각해보십시오.

+0

내 코드에이 코드를 적용하는 방법을 잘 모르겠습니다. 오류가 발생합니다. 포인터 기본 유형이 cython.array 기본 유형과 일치하지 않습니다. –

+0

단순히 배열을 강제로 지정하면 뾰족한 메모리가 누수됩니다. 이것은 데이터를 로컬에서 (cython으로) 사용하고 데이터 자체와 다른 것을 반환하려는 경우에만 좋은 아이디어입니다. – gg349

1

stream.read()buffer이 가리키는 메모리를 할당합니다. 이 경우 C++ 공간에 할당 된 파이썬 공간 데이터로 돌아갈 수 없습니다. 당신은해야한다 :

1) 파이썬/사이 썬 코드

2, 선호하는 경우) 파이썬 객체, 또는 numpy 배열을 만들 할당 된 새 반짝 파이썬 객체에 *buffer가 가리키는 할당 된 메모리에서 데이터를 복사 파이썬 공간에서. 그런 다음이 객체를 반환 할 수 있습니다.

파이썬이 어떤 식 으로든 C 공간에 할당 된 메모리를 처리 할 수 ​​없기 때문에 필요합니다. C 코드에 의해 할당 된 메모리가 누수됩니다 (즉, 할당이 해제되지 않음).

이제는 cdef char *buffer = ''으로 오류가 발생하지 않는 이유를 묻습니다. 후자의 경우, cython은 buffer이 문자열을 가리킨다는 것을 인식하고 buffer이 가리키는 내용으로 자동으로 새로운 파이썬 객체를 생성합니다. buffer가 스택에 당신의 C 컴파일러에 의해 초기화됩니다

%%cython 
def ReturnThisString(): 
    cdef char *buffer = 'foobar' 
    return buffer 

print ReturnThisString() #this outputs 'foobar' 

공지 것을, 당신은 파이썬에서이 기능을 사용하면 문자열이 여전히 메모리 위치에있을 것이라는 보장은 없다 : 예 ipython에 대해 다음과 같습니다. 그러나, cython 반환 문을 실행하면 자동으로 char * 포인터에서 파이썬 문자열을 초기화합니다. (파이썬 3에서는 @Veedrac이 말했듯이 bytes으로 바뀌었지만, 이것은 사소한 부분입니다.) 이 두 번째 경우에는 파이썬 객체의 생성과 복사 작업이 숨겨져 있고 cython에 의해 처리되지만 여전히 남아 있습니다.