注:本文参考了博文:http://www.cnblogs.com/linxr/archive/2011/07/22/2113843.html
python功能强大,拥有丰富的库,可以轻而易举的做很多用C、C++等重量级语言不太方便做到的事情,因为如果在C语言中调用Python脚本,则会分发挥python的优点,而且很重要的一点,由于python是解释执行,如果python中的模块发生改变,不需要重新编译源代码,灵活性比C更高。
实际上C语言调用python还是比较方便的,本质上就是上C语言模块所在进程成为python的执行环境就好了,今天试验了一把,比较顺利。我的验证环境是VS2008+Python2.7。
首先用python写了一个脚本,pytest.py,里面定义了一个add函数,如下:
#pytest
def add(a,b):
print "in python function add"
return a+b+1
然后建立了一个C语言控制台工程ccllpython,加入python的include路径,并增加附加链接模块python27.lib,源码如下:
// ccallpython.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Python.h"
int PyCall( const char * module, const char * function, const char *format, ... )
{
PyObject* pMod = NULL;
PyObject* pFunc = NULL;
PyObject* pParm = NULL;
PyObject* pRetVal = NULL;
//导入模块
if( !(pMod = PyImport_ImportModule(module) ) ){
return -1;
}
//查找函数
if( !(pFunc = PyObject_GetAttrString(pMod, function) ) ){
return -2;
}
//创建参数
va_list vargs;
va_start( vargs, format );
pParm = Py_VaBuildValue( format, vargs );
va_end(vargs);
//函数调用
pRetVal = PyEval_CallObject( pFunc, pParm);
int ret;
PyArg_Parse( pRetVal, "i", &ret );
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
Py_Initialize();
printf( "ret = %d\n", PyCall( "pytest", "add", "(ii)", 99, 1));
Py_Finalize();
return 0;
}
在主函数中,通过调用python提供的
PyEval_CallObject方法实现了,调用pytest中的add函数。
in python function add
ret = 101