使用“C”扩展Python 2.7 - 添加PyObject成员变量

时间:2018-06-13 22:47:54

标签: python python-2.7 cpython

我正在尝试使用“C”代码扩展Python 2.7.x.

我知道我可以使用

创建一个模块
Py_InitModule(char *name, PyMethodDef *methods)

这适用于向模块添加方法。

我想在我使用Py_InitModule()创建的模块中添加一个字符串。 如何添加成员变量,例如name = "my_module"idx=5

谢谢!

1 个答案:

答案 0 :(得分:2)

扩展和嵌入文档的Extending Python with C or C++一章中有一个概述和示例。如果您想手动编写扩展模块,那么您真的需要阅读。参考详细信息主要在C-API文档的Module Objects章节中。

虽然模块对象是完全正常的对象,并且您始终可以使用PyModule_GetDictPyObject_SetAttr来访问它们的dict,但有一些特殊功能可以使这更容易。最常见的方法是在模块init函数中构造对象,就像在任何地方构造任何Python对象一样,然后调用PyModule_AddObject

  

将对象添加到模块作为名称。这是一个便利功能,可以从模块的初始化功能中使用。这会窃取对的引用。错误时返回-1,成功时返回0。

对此的一个主要变化是将对象存储在static中并过度引用它以便永远不会删除它。请参阅SpamError章节中的Extending示例。

但是对于您的具体示例,您只是尝试添加一个字符串常量,这更容易,因为有甚至是特定的函数来添加本机类型的常量:

PyMODINIT_FUNC
initspam(void) {
    PyObject *mod = Py_InitModule("spam", SpamMethods);
    if (!mod) return;
    if (PyModule_AddStringConstant(mod, "mystring", "This is my string") == -1) return;
}