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()])
으로 구축하고 얻을 ...
나는 뭔가를 놓친가요? 당신이 요구하지 않는 : http://docs.python.org/library/ctypes.html#ctypes-pointers – mjhm
그건 파이썬 코드입니다. C에서 포인터를 생성해야합니다. –
SWIG를 사용하고 싶습니까? 너무 강력합니다 ~~~ – kaitian521