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

时间:2013-07-22 17:06:45

标签: 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 / C API文档中所述。不幸的是,我对全局变量失败了。

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

非常感谢

埃里克

2 个答案:

答案 0 :(得分: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

此致

巴勃罗

答案 1 :(得分:1)

当然可以。可能最简单的方法是使用Py_BuildValue()为这些变量创建Python对象,然后使用PyObject_SetAttrString()将它们添加到模块对象(使用Py_InitModule()创建的对象)中。

如果这些全局变量的内容可能会随着时间的推移而发生变化,并且您希望Python代码能够看到最新的值,那么最好还是暴露出返回当前值的额外方法。

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