python - 使用“C”扩展 Python 2.7 - 添加 PyObject 成员变量
问题描述
我正在尝试使用“C”代码扩展 Python 2.7.x。
我知道我可以使用
Py_InitModule(char *name, PyMethodDef *methods)
这可以很好地向模块添加方法。
我想向我使用创建的模块添加一个字符串Py_InitModule()
。如何添加成员变量,例如name = "my_module"
, 或idx=5
?
谢谢!
解决方案
在扩展和嵌入文档的使用 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;
}
推荐阅读
- python - 如何根据每小时多个数据点的时间戳按小时/天创建 seaborn 热图
- python - LSTM 模型中未定义 Dropout_U 和 Dropout_W
- postgresql - 气流导出模式仅从 PostgreSQL 到 bigquery
- javascript - JavaScript - 在保存在 localStorage 后恢复对象中的地图的问题
- javascript - 笑话:模拟构造函数
- android - 当我将 Android Studio 更新到 4.1 版时,Google Sceneform 插件停止工作
- android - 使用带有 rxandroid Completable 的自定义转换器
- mysql - MySQL更新查询子查询慢的地方
- javascript - 如何在 JavaScript 中找到两个数组之间的公共元素?
- html - 多次使用 br 标签来创建导航菜单是否合适?什么是更好的选择?