3

我必须为来自第三方包的 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我使用Python/C API 文档中解释的机制成功地将 C 方法导出到我的 python 扩展。不幸的是,我对全局变量失败了。

有没有办法将这些变量(mcnumipar 和 mcinput)导出到我的 python 扩展中?

多谢

埃里克

4

2 回答 2

1

当然。可能最简单的方法是使用 为这些变量创建 Python 对象Py_BuildValue(),然后Py_InitModule()使用PyObject_SetAttrString().

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

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

于 2013-07-22T18:28:13.470 回答
1

请检查 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

问候,

巴勃罗

于 2018-04-19T14:45:13.323 回答