C语言调用Python脚本中的函数

注:本文参考了博文: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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值