将C全局变量导出到python扩展

2024-10-01 04:49:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须编写一个来自第三方包的C模块的python扩展。模块包含一些方法的声明,以及模块级别的以下变量的声明:

int mcnumipar = 13;

struct my_struct {char *name;
                  void *par;
                  enum instr_formal_types type;
                  char *val;};

struct my_struct mcinput[mcnumipar+1] = {
    "E0", &mcipE0,  instr_type_double, "4.94",
    "dE", &mcipdE, instr_type_double, "0.24", 
    "dt", &mcipdt, instr_type_double, "6.4e-6", 
    "coh", &mcipcoh, instr_type_string, "Rb_liq_coh.sqw", 
    "inc", &mcipinc, instr_type_string, "Rb_liq_inc.sqw"
};

我成功地使用PyMethodDef机制将C方法导出到python扩展,如python/capi文档中所述。不幸的是,我的全局变量失败了。在

有没有办法将这些变量(mcnumipar&mcinput)导出到python中 延期?在

非常感谢

埃里克


Tags: 模块方法声明stringmytypestructdouble
2条回答

请检查Cpython函数: PyModule_AddIntConstant,PyModule_AddStringConstant,PyModule_AddObject

示例:

 /* Adding module globals */
    if (PyModule_AddIntConstant(m, NAME_INT, 42)) {
        goto except;
    }
    if (PyModule_AddStringConstant(m, NAME_STR, "String value")) {
        goto except;
    }
    if (PyModule_AddObject(m, NAME_TUP, Py_BuildValue("iii", 66, 68, 73))) {
        goto except;
    }
    if (PyModule_AddObject(m, NAME_LST, Py_BuildValue("[iii]", 66, 68, 73))) {
        goto except;
    }

这里有一个完整的教程,其中有几个对我有用的用例:http://pythonextensionpatterns.readthedocs.io/en/latest/module_globals.html

谨致问候

巴勃罗

当然可以。最简单的方法可能是用^{}为这些变量创建Python对象,然后使用^{}将它们添加到module对象(使用^{cd2>}创建的对象)。在

如果这些全局变量的内容可能会随着时间而变化,并且您希望Python代码能够看到最新的值,那么最好公开返回当前值的额外方法。在

作为第三种选择,您可以相当容易地使用ctypes来检查甚至更改这些变量的当前值。为API的一部分构建一个真正的Python-C模块,并通过ctypes公开其余部分,这可能有点奇怪,但它最终可能会满足您的需要。在

相关问题 更多 >