我希望使用Python3 C API添加内置函数。我这样做只是为了帮助我熟悉Python C API。 this问题的答案很好地解释了为什么人们可能不想这样做。无论如何,我想在Python foo
模块中添加一个函数builtins
。
这是我迄今为止所做的事情(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/
目录中。
答案 0 :(得分:3)
仅仅因为你将它放在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
覆盖了手动添加的{{1}再次......
除此之外:将它放在builtins.foo
文件夹中并不意味着它在启动Python时实际导入。您需要自己使用Modules/
或修改Python启动以导入它。
好的,除此之外,您应该问自己以下问题:
import foo
文件夹中的bltinsmodule.c
,然后完全编译Python。Python/
文件夹中,而是真正创建一个包(用Modules/
完成等等)并且不要在module-init中返回setup.py
模块。只需创建一个空模块,并在将builtins
添加到foo
模块后将其返回。并使用不同的模块名称,可能是builtins
,因此它不会与新添加的_foo
函数发生冲突。builtins.foo
那么那就错了。 Python-C-API只允许更快的访问和对Python功能的更多访问。如果您只想做Python的东西(而不是C库的接口),那么使用普通Python模块无法用C-API做的事情很少。我会说,对于你的用例,创建一个扩展模块是完全矫枉过正的,所以也许只需使用普通的Python模块。我的建议是使用上面提到的builtins
并让Python在启动时导入它。为此,您将foo.py
文件(我真的建议您将名称更改为类似foo.py
的内容)放在安装其他软件包的目录(Windows上为_foo.py
)并使用{{ 3}}(或另一种定制启动方法)在Python启动时导入该模块。