我有一個yec.c文件中定義的結構與兩種功能的C語言結構指針:通行證從使用Python ctypes的
#include <python2.7/Python.h>
struct mec
{
int age;
int number;
};
static PyObject* nopoint(PyObject* self, PyObject* args)
{
struct mec m;
int n1, n2;
if (!PyArg_ParseTuple(args, "ii", &n1, &n2))
return NULL;
printf("nopoint(c) nombres: %d et %d!\n", n1, n2);
m.age = n1;
m.number = n2;
printf("nopoint(c) age nb: %d et %d!\n", m.age, m.number);
return Py_BuildValue("i", n1 + n2);
}
static PyObject* viapoint(PyObject* self, PyObject* args)
{
struct mec *m;
if (!PyArg_ParseTuple(args, "o", &m))
return NULL;
printf("viapoint av(c) age nb: %d et %d!\n", m->age, m->number);
m->age = 10;
m->number = 1;
printf("viapoint ap(c) age nb: %d et %d!\n", m->age, m->number);
return Py_BuildValue("i", m->age + m->number);
}
static PyMethodDef MyYecMethods[] = {
{"nopoint", nopoint, METH_VARARGS, "Description de fune"},
{"viapoint", viapoint, METH_VARARGS, "Description de fdeux"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
inityec(void)
{
(void) Py_InitModule("yec", MyYecMethods);
}
我的yec.c文件與python setup_yec.py build
命令編譯成yec.so以下setup_yec.py文件:
from distutils.core import setup, Extension
module1 = Extension('yec', sources = ['yec.c'])
setup (name = 'YecPkg',
version = '1.0',
description = 'This is a demo of yec pkg',
ext_modules = [module1])
我可以使用Python和nopoint()函數的工作在我的編譯庫:
import yec
yec.nopoint(3, 4)
我想用第二個函數;它應該接受來自Python中的結構指針,我定義了相關ctypes.Structure我的圖書館的經過點():
from ctypes import *
class Mec(Structure):
_fields_ = [("age", c_int),
("number", c_int)]
m = Mec(1, 2)
print "py mec class", m.age, m.number
yec.viapoint(byref(m))
。當然,這是行不通的:
Traceback (most recent call last):
File "testyec.py", line 18, in <module>
yec.viapoint(byref(m))
TypeError: must be impossible<bad format char>, not CArgObject
如果有人知道如何修改viapoint()函數以便能夠通過PyArg_ParseTuple()解析結構指針,以及如何在Python中使用python結構指針(使用byref?),這將是一個很大的幫助。
謝謝。
好吧,使用讀寫緩衝方法更安全!我會改變我的代碼。謝謝。 – user1520280
如果我將在C中創建結構,並通過c庫中的函數返回它的指針。我只是簡單地將它存儲在python中的變量中,或者還有另一種方法可以在python中使用它,如你所描述的那樣? – user1520280
我的答案中的方法僅適用於實現具有可寫緩衝區的緩衝區接口的Python對象。您可以將它與ctypes數據類型或NumPy數組一起使用,等等。通過Python走私指針的最好方法是將其封裝在「PyCapsule」中。說你'malloc'結構的內存。然後用一個析構函數創建膠囊,在指針上調用'free'。 – eryksun