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语言中调用Python代码,包括初始化Python环境、导入Python模块、调用Python函数等步骤,并通过一个具体示例展示了C语言与Python交互的过程。
464

被折叠的 条评论
为什么被折叠?



