《扩展和嵌入python解释器》1.4 模块方法表和初始化函数
2006-06-21 21:26
399 查看
1.4 模块方法表和初始化函数
下面,我演示如何从Python程序调用spam_system().首先,我们需要在’方法表’列出名称和地址:
当仅使用时"METH_VARARGS",函数希望Python-level参数经由PyArg_ParseTuple()被传递进来。下面提供这个函数的详细信息。
如果关键字参数被传递到函数,第三个字段的METH_KEYWORDS应被设置为1。在这中情况下, C函数应接受第三个 "PyObject *"参数,此参数是关键字字典。使用PyArg_ParseTupleAndKeywords()函数分析参数。方法表必须在模块初始化函数中传递到解释器。初始化函数必须命名为initname(),
名称是模块名称,并且在模块文件的定义是non-static的。
当Python程序第一次导入spam模块时,initspam()函数被调用 (参见下面关于嵌入Python的说明)。
initspam()函数调用Py_InitModule(),Py_InitModule()函数创建模块对象 (插入到
当嵌入Python时,除非在_PyImport_Inittab表中有一项,否则initspam()不被自动调用。最早的处理此事的办法是:在调用Py_Initialize()后,直接调用你的静态初始化的静态连接模块的initspam()
在Python源代码包,你能找到一个例子:Demo/embed/demo.c。
注意: 对于一些扩展模块,从
on Unix, .dll on Windows)中加载的,则不会再次加载模块。
Python源代码发布包中包括更多模块例子,一般在Modules/xxmodule.c。这些文件可以用做模板或简单阅读的例子。源代码发布中包括modulator.py脚本或windows安装提供一个简单的图形界面接口声明函数和要实现的模块对象,并产生一个可以填充的模板。脚本位于Tools/modulator/路径,详细信息请参阅README文件。
下面,我演示如何从Python程序调用spam_system().首先,我们需要在’方法表’列出名称和地址:
static PyMethodDef SpamMethods[] = { ... {"system", spam_system, METH_VARARGS, "Execute a shell command."}, ... {NULL, NULL, 0, NULL} /* Sentinel */ };
注意第三项("METH_VARARGS")。这是一个标志,用来告诉解释器应使用调用C函数的规则。它一般总是 "METH_VARARGS" 或 "METH_VARARGS | METH_KEYWORDS"; 值[code]0表示PyArg_ParseTuple()函数使用的变量是废弃的。
当仅使用时"METH_VARARGS",函数希望Python-level参数经由PyArg_ParseTuple()被传递进来。下面提供这个函数的详细信息。
如果关键字参数被传递到函数,第三个字段的METH_KEYWORDS应被设置为1。在这中情况下, C函数应接受第三个 "PyObject *"参数,此参数是关键字字典。使用PyArg_ParseTupleAndKeywords()函数分析参数。方法表必须在模块初始化函数中传递到解释器。初始化函数必须命名为initname(),
名称是模块名称,并且在模块文件的定义是non-static的。
PyMODINIT_FUNC initspam(void) { (void) Py_InitModule("spam", SpamMethods); }
注意: PyMODINIT_FUNC声明函数返回值类型为[code]void,并声明平台所需的特定连接指示,对于C++声明函数为extern "C"类型。
当Python程序第一次导入spam模块时,initspam()函数被调用 (参见下面关于嵌入Python的说明)。
initspam()函数调用Py_InitModule(),Py_InitModule()函数创建模块对象 (插入到
sys.modules字典"spam"键下),并在根据第二个传入参数的表(PyMethodDef结构数组)所创建的对象的基础上,插入内置功能对象。
Py_InitModule()函数返回一个指向它所创建对象的指针(此处没有使用)。如果模块不能正确初始化,函数则因严重错误终止,所以,调用者不必检查错误。
当嵌入Python时,除非在_PyImport_Inittab表中有一项,否则initspam()不被自动调用。最早的处理此事的办法是:在调用Py_Initialize()后,直接调用你的静态初始化的静态连接模块的initspam()
int main(int argc, char *argv[]) { /* Pass argv[0] to the Python interpreter */ Py_SetProgramName(argv[0]); /* Initialize the Python interpreter. Required. */ Py_Initialize(); /* Add a static module */ initspam(); }
在Python源代码包,你能找到一个例子:Demo/embed/demo.c。
注意: 对于一些扩展模块,从
sys.modules模块删除入口点,或在一个进程(或在没有exec()干预的fork()后)中的多个解释器中导入编译后的模块,会产生一些问题。当初始化内部数据结构时,模块作者应该小心处理。还要注意扩展模块能够使用reload()函数,并且调用模块的初始化函数(在本例中是initspam()函数),但如果模块是从可动态加载文件(.so
on Unix, .dll on Windows)中加载的,则不会再次加载模块。
Python源代码发布包中包括更多模块例子,一般在Modules/xxmodule.c。这些文件可以用做模板或简单阅读的例子。源代码发布中包括modulator.py脚本或windows安装提供一个简单的图形界面接口声明函数和要实现的模块对象,并产生一个可以填充的模板。脚本位于Tools/modulator/路径,详细信息请参阅README文件。
相关文章推荐
- ThinkPHP在模块所有方法前初始化函数
- erlang的dict模块函数方法介绍
- C#报错“OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码”的解决方法。
- python中使用sys模板和logging模块获取行号和函数名的方法
- 初始化mysql数据库提示缺少Data:dumper模块解决方法
- 内核模块初始化函数static int __init init_func() 和退出函数 static void _exit exit_func() _init 和_exit 的理解
- OC中的方法、设置器与访问器、便利初始化函数及便利构造器的相关问题
- 初始化mysql数据库提示缺少Data:dumper模块解决方法
- youku的js脚本的工具函数和初始化方法
- PHP检测PHP环境是否支持某个模块、某个函数的方法
- linux内核调试环境搭建-4 调试模块初始化函数
- os、os.path 模块中关于文件、目录常用的函数使用方法
- 如何设计PHP业务模块(函数/方法)返回结果的结构?
- OC-方法、设置器 与 访问器、便利初始化函数 与 便利构造器
- os、os.path 模块中关于文件、目录常用的函数使用方法
- saltstack-gdlwolf自学总结第五篇(方法案例): pkg模块初始化安装系统常用软件包
- youku的js脚本的工具函数和初始化方法
- [Python]re模块的核心函数和方法
- 面向对象之构造函数(可让程序运行前初始化一些东西)、函数(方法)重载
- python3 os模块文件、目录常用函数方法总结