首页 > 解决方案 > 使用“C”扩展 Python 2.7 - 添加 PyObject 成员变量

问题描述

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

我知道我可以使用

Py_InitModule(char *name, PyMethodDef *methods)

这可以很好地向模块添加方法。

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

谢谢!

标签: pythonpython-2.7cpython

解决方案


在扩展和嵌入文档的使用 C 或 C++ 扩展 Python一章中有概述和示例。如果您想手动编写扩展模块,您真的需要阅读。参考详细信息主要在 C-API 文档的模块对象章节中。

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

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

对此的一个主要变化是将对象存储在 a 中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;
}

推荐阅读