《扩展和嵌入python解释器》1.4 模块方法表和初始化函数
下面,我演示如何从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"; 值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声明函数返回值类型为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文件。
《扩展和嵌入python解释器》1.4 模块方法表和初始化函数的更多相关文章
- 扩展和嵌入 Python 解释器 用 C 或 C++ 编写模块以使用新模块来扩展 Python 解释器的功能 定义新的函数\对象类型\方法。 将 Python 解释器嵌入到另一个应用程序中
// https://python3-cookbook.readthedocs.io/zh_CN/latest/c15/p02_write_simple_c_extension_module.html ...
- python的内置模块xml模块方法 xml解析 详解以及使用
一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...
- python高级 之(四) --- 模块方法
模块 时间模块:time/datatime/calendar. 系统操作文件模块:os time模块 介绍 import time # 获取当前时间, 结果是存在时间元组中的.星期一是从0开始的 # ...
- python正则表达式之re模块方法介绍
python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...
- sys模块-与python解释器交互的模块
需要 import sys a=sys.platform #获取当前系统平台 #如果是window系统就返回‘win32’#如果是linux系统就返回‘linux’#如果是Windows/Cyg ...
- python的内置模块re模块方法详解以及使用
正则表达式 一.普通字符 . 通配符一个.只匹配一个字符 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 >>> import re ...
- 5.Python安装依赖(包)模块方法介绍
1.前提条件 1). 确保已经安装需要的Python版本 2). 确保已经将Python的目录加入到环境变量中 2. Python安装包的几种常用方式 1). pip安装方式(正常在线安装) 2). ...
- Python 五个常用模块资料 os sys time re built-in
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', ' ...
- (转)python之os,sys模块详解
python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...
随机推荐
- tomcat打开失败原因
我重装系统以后,tomcat无法打开,原因是有的项目的虚拟路径有误 到server.xml下修改虚拟路径
- C# WinForm开发系列学习 地址 很详细
http://www.cnblogs.com/peterzb/archive/2009/07/27/1531910.html
- spir 合并单元格
TableRow row = table2.AddRow(); var cell = row.AddCell(); var par = cell.AddParagraph(); par.Text = ...
- HAProxy & Keepalived L4-L7 高可用负载均衡解决方案
目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...
- 32 位bitmap 内存存储 顺序 bgra 前3位 与23位一致。 都是 bgr 呵呵 与rgb 相反
32 位bitmap 内存存储 顺序 bgra 前3位 与23位一致. 都是 bgr 呵呵 与rgb 相反
- MySQL学习-MySQL内置功能_索引与慢查询
1.索引基础 1.1 介绍 (1.)为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂 ...
- Windows.命令行(CMD)_执行命令&环境变量
1.CMD命令中如果 命令有换行的话,就使用 ^来连接(这就类似于 Linux命令行中 \ 的作用) 2.环境变量 2.1.显示 所有环境变量的值,命令:set 2.2.显示 某个环境变量的值,命令 ...
- unsigned char bcd串乱码问题解决
unsigned char bcd[13]; ...... string bcdstr; for(int i=0;i < 12;i++) { bcdstr=FormatString(" ...
- C语言Ⅰ博客作业01
1.你对计算机科学与技术专业了解是怎样? 本专业培养具有良好的科学素养,系统地.较好地掌握计算机科学与技术包括计算机硬件.软件与应用的基本理论.基本知识和基本技能与方法,能在科研部门.教育单位.企业. ...
- 大数据平台CentOS7+CDH5.12.1集群搭建
1.CM(Cloudera Manager)介绍 1.1 简介 Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具,使得安装集群从几天的时间缩短在几个小 ...