C/C++ 调用 Python(实例)
来源:互联网 发布:美国钻井平台数据最新 编辑:程序博客网 时间:2024/06/04 08:54
Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。
你也可以在自己的程序中调用Python,看起来非常容易:
//my_python.c#include <Python.h>int main(int argc, char *argv[]){ Py_SetProgramName(argv[0]); Py_Initialize(); PyRun_SimpleString("print 'Hello Python!'\n"); Py_Finalize(); return 0;}
虽然非常简单,但这段代码除了能用C语言动态生成一些Python代码之外,并没有什么用处。我们需要的是C语言的数据结构能够和Python交互。
下面举个例子,比如说,有一天我们用Python写了一个功能特别强大的函数:
def great_function(a): return a + 1
接下来要把它包装成C语言的函数。我们期待的C语言的对应函数应该是这样的:
int great_function_from_python(int a) { int res; // some magic return res;}
首先,复用Python模块得做‘import’,这里也不例外。所以我们把great_function放到一个module里,比如说,这个module名字叫 great_module.py
接下来就要用C来调用Python了,完整的代码如下:
#include <Python.h>#include<iostream>using namespace std;int great_function_from_python(int a); int main(int argc, char *argv[]) { Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化 printf("%d",great_function_from_python(10)); cout<<endl; Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的}int great_function_from_python(int a) { int res; PyObject *pModule,*pFunc;//声明变量 PyObject *pArgs, *pValue;//声明变量 /* import */ pModule = PyImport_Import(PyString_FromString("great_module"));//调用的Python文件名 /* great_module.great_function */ pFunc = PyObject_GetAttrString(pModule, "great_function"); //调用的函数名 /* build args */ pArgs = PyTuple_New(1); //函数调用的参数传递均是以元组的形式打包的,1表示参数个数 PyTuple_SetItem(pArgs,0, PyInt_FromLong(a)); /* call */ pValue = PyObject_CallObject(pFunc, pArgs);//调用函数 res = PyInt_AsLong(pValue); return res;}
从上述代码可以窥见Python内部运行的方式:
所有Python元素,module、function、tuple、string等等,实际上都是PyObject。C语言里操纵它们,一律使用PyObject *。
Python的类型与C语言类型可以相互转换。Python类型XXX转换为C语言类型YYY要使用PyXXX_AsYYY函数;C类型YYY转换为Python类型XXX要使用PyXXX_FromYYY函数。
也可以创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量。
若a是Tuple,则a[i] = b对应于 PyTuple_SetItem(a,i,b),有理由相信还有一个函数PyTuple_GetItem完成取得某一项的值。
不仅Python语言很优雅,Python的库函数API也非常优雅。
作者:Jerry Jho;
转:http://www.zhihu.com/question/23003213/answer/56121859
来源:知乎
- C/C++ 调用 Python(实例)
- Python调用C/C++(使用SWIG)
- PYTHON 与C相互交互调用实例解析
- PYTHON 与C相互交互调用实例解析
- PYTHON 与C相互交互调用实例解析
- python调用c函数的一个简单实例
- C扩展python实例
- GO 语言调用C函数(实例)
- BCB(C++)调用Python
- C中调用PYTHON
- C调用python
- C调用python
- Python 调用 C函数
- python调用c
- Python 调用C
- c中调用python
- Python调用c/c++
- c 调用python
- IOS UIScrollView——简单示例
- 设计模式之 原型模式(prototype)(C++实现 深拷贝 + 浅拷贝版本[bug])
- 对URL的使用
- OnItemClickListener 没响应的根本原因-源码解析
- [BZOJ3050][Usaco2013 Jan]Seating(线段树)
- C/C++ 调用 Python(实例)
- 几种常见的货币制度简介
- html学习笔记3
- Git SVN 区别
- C++实验2-计算标准体重
- IOS学习 GCD 延时执行三种方法 并行/串行/主队列综合练习 队列组 shift+command+o快速查找
- Cannot create __weak reference in file using manual refrence counting.
- 文章标队和栈的一些区别
- Android四大组件