Python与C互相调用
作者:网络转载 发布时间:[ 2016/5/10 14:03:42 ] 推荐标签:.NET 测试开发技术
初始化c实现的python模块
为了能在python脚本中调用到c中定义的方法,需要先在c中定义一个python模块,然后在脚本中import这个模块,后通过这个模块来间接调用c中定义的方法。例如,我们通过c定义了一块内存区域data和对这个内存区域操作的函数SetData与GetData(代码如下),怎样在脚本中调用SetData与GetData函数来操作data呢?其实关键问题是怎么样在脚本中调用SetData和GetData函数,如果能在脚本中调用这两个函数,自然能操作data了。python中通过模块的方式来解决这个问题。
1 #define min(a,b) (((a) < (b)) ? (a) : (b))
2
3 char data[1024];
4
5 void SetData(const char *str)
6 {
7 strncpy(data, str, min(strlen(str) + 1, 1024));
8 }
9
10 const char *GetData()
11 {
12 return data;
13 }
在c中定义一个python模块有特定的步骤,具体代码如下:
1 PyDoc_STRVAR(PySetData_doc__, "
2 测试
3
4 PySetData(str)
5 str: 出入的字符串
6 返回:
7 null
8 ");
9 static PyObject* PySetData(PyObject *self, PyObject *args)
10 {
11 const char* str = NULL;
12 if ( !PyArg_ParseTuple(args, "s", &str) )
13 {
14 return 0;
15 }
16 SetData(str);
17 Py_RETURN_NONE;
18 }
19
20 PyDoc_STRVAR(PyGetData_doc__, "
21 打印数据
22
23 PyGetData()
24 返回:
25 data
26 ");
27 static PyObject* PyGetData(PyObject *self, PyObject *args)
28 {
29 const char* str = NULL;
30 return PyString_FromString(GetData());
31 }
32
33 static PyMethodDef module_methods[] = {
34 {"py_set_data", PySetData, METH_VARARGS, PySetData_doc__},
35 {"py_get_data", PyGetData, METH_VARARGS, PyGetData_doc__},
36 {NULL}
37 };
38 void InitCCallPy()
39 {
40 PyObject *module = Py_InitModule3("pycallc", module_methods,
41 "python call c");
42 }
Py_InitModule3用来定义一个python模块,第一个参数是模块的名字,第二个参数是模块中的方法描述集合,第三个参数是模块的描述信息。上面代码中我们定义了一个叫pycallc的模块,方法描述集合module_methods描述了两个方法py_set_data和py_get_data,这两个方法对应的函数地址是PySetData和PyGetData,这两个函数终会分别调用前面定义的SetData和GetData。这样我们在python脚本中通过pycallc模块的py_set_data和py_get_data方法可以设置和获取data数据了。看了上面的实现,其实这个python模块的主要作用是把c中定义的函数再封装一次,封装的函数能够被python识别。
在python脚本中调用c实现的python模块
由于前面已经通过c代码初始化了一个python模块pycallc,那么在脚本中我们可以通过import导入这个模块,并调用这个模块中的函数。具体代码如下:
1 # -*- coding: utf-8 -*-
2
3 import pycallc
4
5 def test():
6 print 'in python : ', pycallc.py_get_data()
7 pycallc.py_set_data("change hello world!")
这样我们实现了在python脚本中调用c中的方法。
上面完整的代码demo的链接:https://github.com/morningstatus/python/tree/master/ccallpy
总结
从上面c调用python,python调用c,其实都是一些固定的步骤,知道会用了,没有会不会的问题,只有想不想知道的问题。没有接触这个技术前可能觉得它很高深,但其实只要稍微花点心思去了解它,它也其实没有这么难。计算机很多技术不外乎都是这样,只有你想不想的问题,没有你会不会的问题,多问,多思考,多学习,总有你也能成为技术大牛。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
适合Java开发者学习的Python入门教程300行Python代码打造实用接口测试框架数据库并行读取和写入之Python实现Python单元测试??使用装饰器实现测试跳过和预期故障python小工具:用python操作HP的Quality CenterPython:Anaconda安装虚拟环境到指定路径Ubuntu 从零开始搭建Python开发环境如何简单实现接口自动化测试??基于pythonpython unittest控制用例的执行顺序用Python写一个NoSQL数据库python unittest之加载及跳过测试方法和示例通过Python的JIRA库操作JIRAAppium+Python做移动端自动化测试Python使用装饰器在执行单元测试时配置环境使用Python对SQLite数据库操作性能测试平台效率优化的一次经验(Python版)
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南