如何使用Python C API复制以下Python代码? class Sequence(): def __init__(self, max): self.max = max def data(self): i = 0 while i < self.max: yield i i += 1 到目前为止,我有这样的: #include <Python/Python.h> #include <Python/structmember.h> /* Define a new object class, Sequence. */ typedef struct { PyObject_HEAD size_t max; } SequenceObject; /* Instance variables */ static PyMemberDef Sequence_members[] = { […]
假设我们的Noddytypes是在编写Python的C扩展模块的教程中定义的。 现在我们要创build一个派生types,只覆盖Noddy的__new__()方法。 目前我使用下面的方法(为了可读性剥离错误检查): PyTypeObject *BrownNoddyType = (PyTypeObject *)PyType_Type.tp_alloc(&PyType_Type, 0); BrownNoddyType->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; BrownNoddyType->tp_name = "noddy.BrownNoddy"; BrownNoddyType->tp_doc = "BrownNoddy objects"; BrownNoddyType->tp_base = &NoddyType; BrownNoddyType->tp_new = BrownNoddy_new; PyType_Ready(BrownNoddyType); 这工作,但我不知道是否是正确的做法。 我会期望我也必须设置Py_TPFLAGS_HEAPTYPE标志,因为我dynamic地在堆上分配types对象,但这样做会导致解释器中的段错误。 我也想过使用PyObject_Call()或类似的方法显式调用type() ,但我放弃了这个想法。 我需要将函数BrownNoddy_new()包装在一个Python函数对象中,并创build一个将__new__映射到这个函数对象的字典,这似乎很愚蠢。 什么是最好的方式去做这件事? 我的方法是否正确? 有没有我错过的界面function? 更新 在python-dev邮件列表(1) (2)的相关主题上有两个线程。 从这些线程和几个实验我推断,我不应该设置Py_TPFLAGS_HEAPTYPE除非types是通过调用type()分配的。 在这些线程中有不同的build议是手动分配types还是调用type()更好。 如果我知道推荐的方法来包装应该在tp_new插槽中执行的C函数,我会对后者感到满意。 对于常规的方法,这一步将很容易 – 我可以使用PyDescr_NewMethod()来获得合适的包装对象。 我不知道如何为我的__new__()方法创build这样一个包装器对象 – 也许我需要未PyCFunction_New()的函数PyCFunction_New()来创build这样一个包装器对象。
我想调用一个自定义的函数,它是从C的python模块中定义的。我有一些初步的代码来做到这一点,但它只是输出到标准输出。 mytest.py import math def myabs(x): return math.fabs(x) TEST.CPP #include <Python.h> int main() { Py_Initialize(); PyRun_SimpleString("import sys; sys.path.append('.')"); PyRun_SimpleString("import mytest;"); PyRun_SimpleString("print mytest.myabs(2.0)"); Py_Finalize(); return 0; } 我怎样才能提取返回值到一个C双,并在C中使用它?
我将要问的问题似乎是Python对__new__和__init__的使用的重复? ,但无论如何,我还不清楚__new__和__init__之间的实际区别是什么。 在你急于告诉我__new__是用来创build对象的,而__init__是用来初始化对象的之前,让我明白一点: 我明白了。 实际上,这个区别对我来说是很自然的,因为我有C ++的经验,在C ++中我们有了新的位置 ,它将对象分配和初始化分开。 Python C API教程如下解释: 新成员负责创build(而不是初始化)types的对象。 它在Python中作为__new__()方法__new__() 。 … 实现新方法的一个原因是确保实例variables的初始值 。 所以,是的 – 我得到了什么__new__ ,但是尽pipe如此,我仍然不明白为什么它在Python中很有用。 给出的例子说,如果你想“确保实例variables的初始值”, __new__可能是有用的。 那么,是不是__init__会做什么? 在C API教程中,显示了一个示例,其中创build了一个新的Type(称为“Noddy”),并定义了Type的__new__函数。 Noddytypes包含一个名为first的string成员,并且这个string成员被初始化为一个空string,如下所示: static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ….. self->first = PyString_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } ….. } 请注意,如果没有这里定义的__new__方法,我们不得不使用PyType_GenericNew ,它将所有的实例variables成员初始化为NULL。 所以__new__方法的唯一好处是实例variables将以空string开始,而不是NULL。 […]
我正在尝试使用C扩展名文件构build共享库,但首先必须使用以下命令生成输出文件: gcc -Wall utilsmodule.c -o Utilc 执行命令后,我得到这个错误消息: utilsmodule.c:1:20:致命错误:Python.h:没有这样的文件或目录编译终止。 实际上我已经尝试了所有在互联网上的build议解决scheme,但问题仍然存在…我也没有与Python.h问题。 我设法find我的机器上的文件…任何人都面临同样的问题之前?