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
来源:知乎

0 0
原创粉丝点击