1.4 模块方法表和初始化函数

下面,我演示如何从Python程序调用spam_system().首先,我们需要在’方法表’列出名称和地址:

  1. static PyMethodDef SpamMethods[] = {
  2. ...
  3. {"system",  spam_system, METH_VARARGS,
  4. "Execute a shell command."},
  5. ...
  6. {NULL, NULL, 0, NULL}        /* Sentinel */
  7. };
注意第三项("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的。

  1. PyMODINIT_FUNC
  2. initspam(void)
  3. {
  4. (void) Py_InitModule("spam", SpamMethods);
  5. }
注意: 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()

  1. int
  2. main(int argc, char *argv[])
  3. {
  4. /* Pass argv[0] to the Python interpreter */
  5. Py_SetProgramName(argv[0]);
  6. /* Initialize the Python interpreter.  Required. */
  7. Py_Initialize();
  8. /* Add a static module */
  9. initspam();
  10. }

在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 模块方法表和初始化函数的更多相关文章

  1. 扩展和嵌入 Python 解释器 用 C 或 C++ 编写模块以使用新模块来扩展 Python 解释器的功能 定义新的函数\对象类型\方法。 将 Python 解释器嵌入到另一个应用程序中

    // https://python3-cookbook.readthedocs.io/zh_CN/latest/c15/p02_write_simple_c_extension_module.html ...

  2. python的内置模块xml模块方法 xml解析 详解以及使用

    一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...

  3. python高级 之(四) --- 模块方法

    模块 时间模块:time/datatime/calendar. 系统操作文件模块:os time模块 介绍 import time # 获取当前时间, 结果是存在时间元组中的.星期一是从0开始的 # ...

  4. python正则表达式之re模块方法介绍

    python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...

  5. sys模块-与python解释器交互的模块

    需要  import sys a=sys.platform   #获取当前系统平台 #如果是window系统就返回‘win32’#如果是linux系统就返回‘linux’#如果是Windows/Cyg ...

  6. python的内置模块re模块方法详解以及使用

    正则表达式 一.普通字符 .     通配符一个.只匹配一个字符 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 >>> import re ...

  7. 5.Python安装依赖(包)模块方法介绍

    1.前提条件 1). 确保已经安装需要的Python版本 2). 确保已经将Python的目录加入到环境变量中 2. Python安装包的几种常用方式 1). pip安装方式(正常在线安装) 2). ...

  8. Python 五个常用模块资料 os sys time re built-in

    1.os模块   os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果.   os.name:返回当前操作系统名称('posix', 'nt', ' ...

  9. (转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

随机推荐

  1. tomcat打开失败原因

    我重装系统以后,tomcat无法打开,原因是有的项目的虚拟路径有误 到server.xml下修改虚拟路径

  2. C# WinForm开发系列学习 地址 很详细

    http://www.cnblogs.com/peterzb/archive/2009/07/27/1531910.html

  3. spir 合并单元格

    TableRow row = table2.AddRow(); var cell = row.AddCell(); var par = cell.AddParagraph(); par.Text = ...

  4. HAProxy & Keepalived L4-L7 高可用负载均衡解决方案

    目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...

  5. 32 位bitmap 内存存储 顺序 bgra 前3位 与23位一致。 都是 bgr 呵呵 与rgb 相反

    32 位bitmap     内存存储 顺序   bgra       前3位 与23位一致.   都是 bgr  呵呵 与rgb 相反

  6. MySQL学习-MySQL内置功能_索引与慢查询

    1.索引基础 1.1 介绍 (1.)为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂 ...

  7. Windows.命令行(CMD)_执行命令&环境变量

    1.CMD命令中如果 命令有换行的话,就使用 ^来连接(这就类似于 Linux命令行中 \ 的作用) 2.环境变量 2.1.显示 所有环境变量的值,命令:set 2.2.显示 某个环境变量的值,命令 ...

  8. unsigned char bcd串乱码问题解决

    unsigned char bcd[13]; ...... string bcdstr; for(int i=0;i < 12;i++) { bcdstr=FormatString(" ...

  9. C语言Ⅰ博客作业01

    1.你对计算机科学与技术专业了解是怎样? 本专业培养具有良好的科学素养,系统地.较好地掌握计算机科学与技术包括计算机硬件.软件与应用的基本理论.基本知识和基本技能与方法,能在科研部门.教育单位.企业. ...

  10. 大数据平台CentOS7+CDH5.12.1集群搭建

    1.CM(Cloudera Manager)介绍 1.1 简介 Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具,使得安装集群从几天的时间缩短在几个小 ...