通过 C-API 向模块添加新命令?

发布于 2024-11-18 01:38:18 字数 184 浏览 1 评论 0原文

如何通过 C-API 向模块动态添加方法?我有很多需要注册的函数,它们不在同一个数组中。我假设我可以使用 NULL 方法表初始化模块,正如文档所说这是可能的。

PyObject *mymod = Py_InitModule("my", NULL);

一次添加一个方法的函数的名称是什么?

How would I dynamically add methods to my module through the C-API? I have many functions I need to register, and they are not in the same array. I assume I can initialize the module with a NULL method table, as the documentation says that's possible.

PyObject *mymod = Py_InitModule("my", NULL);

What is the name of a function to add my methods one at a time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘和柠 2024-11-25 01:38:18

基本上,您必须首先获取模块字典:

d = PyModule_GetDict(m);

将模块名称存储在 PyString 对象中:

n = PyString_FromString("modname");

然后正确填充 PyMethodDef struct ml 并创建一个新的可调用函数:

v = PyCFunction_NewEx(&ml, (PyObject*)NULL, n);

并将此可调用函数添加到模块字典中,该可调用函数由函数名称键入:

PyDict_SetItemString(d, ml->ml_name, v);

我显然跳过了所有相关的错误检查。

所有这些都是我对 Py_InitModule4 确实如此(Py_InitModule 是一个使用默认参数调用 Py_InitModule4 的宏)。

Basically, you'll have to get ahold of the module dict first:

d = PyModule_GetDict(m);

Store the module name in a PyString object:

n = PyString_FromString("modname");

Then properly populate a PyMethodDef struct ml and create a new callable:

v = PyCFunction_NewEx(&ml, (PyObject*)NULL, n);

and add this callable keyed by the function name to the module dict:

PyDict_SetItemString(d, ml->ml_name, v);

I've obviously skipped all relevant error checks.

All this is my interpretation about what Py_InitModule4 does (Py_InitModule is a macro calling Py_InitModule4 with default arguments).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文