gpt4 book ai didi

python - 使用 Python3 C API 添加到内置函数

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:35 24 4
gpt4 key购买 nike

我希望使用 Python3 C API 添加内置函数。我这样做只是为了帮助我熟悉 Python C API。 this的答案问题很好地解释了为什么人们可能不想这样做。无论如何,我想向 Python builtins 模块添加一个函数 foo

这是我目前所做的(foo.c):

#include <Python.h>
#include <stdio.h>

static PyObject*
foo(PyObject *self, PyObject *args){
printf("foo called");
return Py_None;
}

char builtin_name[] = "builtins";
char foo_name[] = "foo";
char foo_doc[] = "foo function";

static PyMethodDef foo_method = {foo_name, foo, METH_NOARGS, foo_doc};

PyMODINIT_FUNC
PyInit_foo(void){
PyObject *builtin_module = PyImport_ImportModule(builtin_name);
PyModule_AddFunctions(builtin_module, &foo_method);
return builtin_module;
}

我将它放在 Python 源目录的 Modules/ 目录中。

最佳答案

仅仅因为您将它放在 Modules/ 文件夹中并使用 Python-C-API 并不意味着它会自动编译和执行。在将 foo.c 编译为 Python 扩展模块后(您这样做了,对吗?)您的代码(大致)等同于:

foo.py

def foo():
"""foo function"""
print("foo called")

import builtins
builtins.foo = foo

在 Python 实现中不是那么简单的事实是,当您 import foo 时,它不会返回您的 foo 模块,而是返回 builtins。但我会说这根本不是一个好主意,特别是因为您要添加的内置函数与您创建的模块同名,所以很可能通过 import foo 您实际上手动覆盖了再次添加 builtins.foo...

除此之外:仅仅将它放在 Modules/ 文件夹中并不意味着它会在您启动 Python 时实际导入。您需要自己使用 import foo 或修改您的 Python 启动以导入它。

好的,除此之外,您应该问自己以下问题:

  • 你想编译你自己的 Python 吗?如果是,那么你可以简单地编辑Python/文件夹中的bltinsmodule.c,然后完全编译Python。
  • 你是否想编译任何东西,但不想编译完整的 Python?如果是,那么只需创建你自己的扩展模块(基本上就像你已经做的那样)但不要将它放在 Python 的 Modules/ 文件夹中,而是真正创建一个包(完成 setup. py 等等),并且不要在 module-init 中返回 builtins 模块。只需创建一个空模块并在将 foo 添加到 builtins 模块后返回它。并使用不同的模块名称,可能是 _foo,这样它就不会与新添加的 builtins.foo 函数发生冲突。
  • 在这种情况下,Python-C-API 和扩展模块是正确的方法吗?如果您认为 Python-C-API 会让添加到 builtins 变得更容易,那您就错了。 Python-C-API 只允许更快地访问和更多地访问 Python 功能。如果您只想做 Python 的事情(而不是与 C 库的接口(interface)),那么使用 C-API 可以做的事情只有很少一部分是您不能用普通的 Python 模块做的。我会说,对于您的用例,创建扩展模块完全是矫枉过正,所以也许只使用普通的 Python 模块。

我的建议是使用上面提到的 foo.py 并让 Python 在启动时导入它。为此,您将 foo.py 文件(我真的建议您将名称更改为类似 _foo.py 的文件)放在安装附加包的目录中(site-packages 在 windows 上)并使用 PYTHONSTARTUP (或另一种自定义启动的方法)在 Python 启动时导入该模块。

关于python - 使用 Python3 C API 添加到内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47054623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com