我必须为来自第三方软件包的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中 延期?
非常感谢
埃里克
答案 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公开其余部分,但它可能最终满足您的需求。