2010-12-28 8 views
2

나는 CTypes 포인터를 메모리에있는 char 배열로 반환해야하는 Python C Extension을 작성하고 있습니다. CTypes 포인터가 필요한 다른 Python 라이브러리와 인터페이스해야합니다.Return to CTypes pointer from C

모든 종류의 CTypes 인터페이스에서 C에 대한 설명서를 찾을 수 없습니다. Python 포인터 생성자를 호출하는 것과 같은 임시 해결책이 있습니까?

static PyObject *get_pointer(myObject *self) 
{ 
    char *my_pointer = self->internal_pointer; 
    return PyCTypes_Pointer(my_pointer); /* how do I turn 'my_pointer' into 
       a Python object representing a CTypes pointer? */ 
} 

미리 감사드립니다.

+0

나는 뭔가를 놓친가요? 당신이 요구하지 않는 : http://docs.python.org/library/ctypes.html#ctypes-pointers – mjhm

+0

그건 파이썬 코드입니다. C에서 포인터를 생성해야합니다. –

+0

SWIG를 사용하고 싶습니까? 너무 강력합니다 ~~~ – kaitian521

답변

0

C로 프로그래밍 중이더라도 Python 자체를 사용해보십시오. 슬프게도 C의 CTypes 인터페이스에 대해 알지 못하고 소스에서 힌트를 찾을 수 없습니다. 어쩌면 자신 만의 PyCTypes_Pointer 메서드를 다음과 같이 작성할 수 있습니다.

필자는 여기에서 정리, 오류 검사 또는 처리를하지 않았지만 Python 2.7 및 3.4와 함께 작동합니다. 당신은 단지 제로 종료 문자열을 처리하는 경우

#include <Python.h> 

static const char *test = "Testing Python ctypes char pointer ..."; 

static PyObject *c_char_p = NULL; 
static PyObject *c_void_p = NULL; 
static PyObject *cast = NULL; 

static PyObject * char_p (void) { 
    PyObject *p = PyLong_FromVoidPtr((void *) test); 
    p = PyObject_CallFunction(c_void_p, "O", p); 
    return PyObject_CallFunction(cast, "OO", p, c_char_p); 
} 

static PyObject *len (void) { 
    return PyLong_FromSize_t(strlen(test)); 
} 

static PyMethodDef methods[] = { 
    {"char_p", (PyCFunction) char_p, METH_NOARGS, ""}, 
    {"len", (PyCFunction) len, METH_NOARGS, ""}, 
    { NULL } 
}; 

#if PY_MAJOR_VERSION >= 3 
static PyModuleDef module = {PyModuleDef_HEAD_INIT, "pyt", "", -1, methods, 
    NULL, NULL, NULL, NULL}; 
#define INIT_FUNC PyInit_pyp 
#else 
#define INIT_FUNC initpyp 
#endif 

PyMODINIT_FUNC INIT_FUNC (void) { 
    PyObject* m; 

    PyObject *ctypes = PyImport_ImportModule("ctypes"); 
    PyObject *c_char = PyObject_GetAttrString(ctypes, "c_char"); 
    c_char_p = PyObject_CallMethod(ctypes, "POINTER", "O", c_char); 
    c_void_p = PyObject_GetAttrString(ctypes, "c_void_p"); 
    cast = PyObject_GetAttrString(ctypes, "cast"); 

#if PY_MAJOR_VERSION >= 3 
    m = PyModule_Create(&module); 
#else 
    m = Py_InitModule("pyp", methods); 
#endif 

    return (PyMODINIT_FUNC) m; 
} 

그냥 어쩌면, 당신이 직접 ctypes.c_char_p을 사용할 수 있습니다,

<class 'ctypes.LP_c_char'> Testing Python ctypes char pointer ... 

같은 출력을

from __future__ import print_function 
from distutils.core import Extension, setup 
import sys 
sys.argv.extend(["build_ext", "-i"]) 
setup(ext_modules = [Extension('pyp', ['pyp.c'])]) 
import pyp 
c = pyp.char_p() 
print(c[:pyp.len()]) 

으로 구축하고 얻을 ...