Questions tagged «python-c-api»

27
致命错误:Python.h:没有这样的文件或目录
我正在尝试使用C扩展文件构建共享库,但首先我必须使用以下命令生成输出文件: gcc -Wall utilsmodule.c -o Utilc 执行命令后,我得到以下错误消息: utilsmodule.c:1:20:致命错误:Python.h:没有此类文件或目录编译终止。 我已经尝试了所有建议的解决方案,但是仍然存在该问题。我没有问题Python.h。我设法在机器上找到该文件。
1189 python  gcc  python-c-api 

5
Python(和Python C API):__new__与__init__
我要问的问题似乎是Python对__new__和__init__的重复使用?,但无论如何,我仍然不清楚__new__和之间的实际区别是什么__init__。 在您急于告诉我__new__创建对象和__init__初始化对象之前,请让我明确:我明白了。 实际上,这种区分对我来说是很自然的,因为我在C ++中有经验,在那里我们放置了new,它类似地将对象分配与初始化分开。 在Python的C API教程解释它是这样的: 新成员负责创建(而不是初始化)该类型的对象。它在Python中作为__new__()方法公开。... 实施新方法的原因之一是要确保实例变量的初始值。 所以,是的-我明白了__new__,但是尽管如此,我仍然不明白为什么它在Python中很有用。给出的示例说,__new__如果要“确保实例变量的初始值” ,这可能会很有用。好吧,这不正是要做__init__什么吗? 在C API教程中,显示​​了一个示例,其中创建了新的Type(称为“ Noddy”),并__new__定义了Type的功能。Noddy类型包含一个名为的字符串成员first,并且该字符串成员被初始化为一个空字符串,如下所示: 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,它只会将所有实例变量成员初始化为NULL。因此,该__new__方法的唯一好处是实例变量将从一个空字符串开始,而不是NULL。 但是,为什么这会有用呢,因为如果我们要确保将实例变量初始化为某个默认值,那么我们可以在__init__方法中做到这一点?
126 python  c  python-c-api 

3
如何在Python C-API中动态创建派生类型
假设我们具有在编写用于Python的C扩展模块Noddy的教程中定义的类型。现在我们要创建一个派生类型,仅覆盖的__new__()方法Noddy。 当前,我使用以下方法(去除了可读性的错误检查): 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标志,因为我在堆上动态分配了类型对象,但这样做会导致解释器出现段错误。 我还考虑过显式调用 type()usingPyObject_Call()或类似方法,但我放弃了这个想法。我需要将函数包装BrownNoddy_new()在Python函数对象中,并创建一个映射__new__到该函数对象的字典,这似乎很愚蠢。 最好的方法是什么?我的方法正确吗?我错过了接口功能吗? 更新资料 在python-dev邮件列表(1) (2)上,有两个主题相关的主题。从这些线程和一些实验中,我得出结论,Py_TPFLAGS_HEAPTYPE除非类型是通过调用分配的,否则不应设置type()。在这些线程中有不同的建议,无论是手动分配类型还是调用类型更好type()。如果只有我知道包装应该放在tp_new插槽中的C函数的推荐方式是什么,我会对后者感到满意。对于常规方法,此步骤很容易-我可以使用它PyDescr_NewMethod()来获取合适的包装对象。我不知道如何为我的__new__()方法创建这样的包装对象,也许我需要未记录的函数PyCFunction_New()来创建这样的包装对象。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.