2011-10-08 6 views
2

내 c dll에서 파이썬으로 이차원 배열의 이질적인 데이터 배열을 반환해야합니다.ctypes를 사용하여 C에서 파이썬 튜플을 반환

내 C DLL에서이 목적을 위해 튜플의 튜플을 반환합니다. PyObject로 반환됩니다 *

튜플의이 튜플은 첫 번째 행의 두 번째 열에 대해 첫 번째 행의 첫 번째 열 tup [0] [1]에 대해 tup [0] [0]으로 액세스해야합니다. 에 ... 내 파이썬 코드에서.

나는 ctypes를 사용하여 튜플의 튜플을 반환하는 c 함수를 호출합니다. 그러나 파이썬 코드에서 반환 된 PyObject *에 액세스 할 수 없습니다.

libc = PyDLL("MyCDLL.dll") 

x = libc.FunctionThatReturnsTuple() 

if x != None : 
    print str(x[0][0]) 
    print str(x[0][1]) 

그러나 오류가 발생합니다 - - 'INT'객체는 첨자에없는 파이썬 스크립트에서
extern "C" _declspec(dllexport) PyObject *FunctionThatReturnsTuple() 
{ 
    PyObject *data = GetTupleOfTuples();  

    return data; //(PyObject*)pFPy_BuildValue("O", data);  
} 

나는 다음과 같은 사용합니다. x가 포인터로 수신되기 때문에 이것이라고 생각합니다.

이것을 달성하는 올바른 방법은 무엇입니까?

+0

, 당신이 수락 한 것도와 upvoted 없음. 도움을받는 응답을 투표하고 수락하면 사람들은 더 기꺼이 도울 것입니다. – Mark

+0

죄송합니다! 나는 그렇게 했어야했다. – Abhaya

답변

8

"FunctionThatReturnsTuple"의 반환 유형을 설정하지 않습니다. C에서

:

#include <Python.h> 

extern "C" PyObject* FunctionThatReturnsTuple() 
{ 
    PyObject* tupleOne = Py_BuildValue("(ii)",1,2); 
    PyObject* tupleTwo = Py_BuildValue("(ii)",3,4); 
    PyObject* data = Py_BuildValue("(OO)", tupleOne, tupleTwo); 

    return data; 
} 

파이썬 :

당신이 스택 오버 플로우에 대한 질문의 번호를 요청했습니다
>>> from ctypes import * 
>>> libc = PyDLL("./test.dll") 
>>> func = libc.FunctionThatReturnsTuple 
>>> func() 
-1215728020 
>>> func.restype = py_object 
>>> func() 
((1, 2), (3, 4)) 
관련 문제