您的位置:首页 > 编程语言 > Python开发

C调用Python函数相关代码示例剖析

2010-03-19 17:04 851 查看
C调用Python函数的相关操作将会在这篇文章中通过一段代码示例来为大
家详细介绍。初学者们可以通过这里介绍的内容充分掌握这一应用技巧。

我们在使用C语言的时候,有时会遇到需要调用Python
函数来完成一些特
定的功能。那么接下来,我们将会在这里为大家详细介绍一下C调用Python函数的相关操作方法,希望可以给大家带来一些帮助。

Python脚本,存为pytest.py

def add(a,b):

print "in python function add"

print "

a

= " + str(a)

print "

b

= " + str(b)

print "

ret

= " + str(a+b)

return a + b

C调用Python函数的代码示例:

#include

<

stdio.h

>

#include

<

stdlib.h

>

#include "C:/Python26/include/python.h"

#pragma comment(lib, "C://Python26//libs//python26.lib")

int main(int argc, char** argv)

{

// 初始化Python

//在使用Python系统前,必须使用Py_Initialize对其

//进行初始化。它会载入Python的内建模块并添加系统路

//径到模块搜索路径中。这个函数没有返回值,检查系统

//是否初始化成功需要使用Py_IsInitialized。

PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal;

Py_Initialize();

// 检查初始化是否成功

if ( !Py_IsInitialized() )

{

return -1;

}

// 载入名为pytest的脚本(注意:不是pytest.py)

pName

=

PyString_FromString

("pytest");

pModule

=

PyImport_Import

(pName);

if ( !pModule )

{

printf("can't find pytest.py");

getchar();

return -1;

}

pDict

=

PyModule_GetDict

(pModule);

if ( !pDict )

{

return -1;

}

// 找出函数名为add的函数

pFunc

=

PyDict_GetItemString

(pDict, "add");

if ( !pFunc || !PyCallable_Check(pFunc) )

{

printf("can't find function [add]");

getchar();

return -1;

}

// 参数进栈

pArgs

=

PyTuple_New

(2);

// PyObject* Py_BuildValue(char *format, ...)

// 把C++的变量转换成一个Python对象。当需要从

// C++传递变量到Python时,就会使用这个函数。此函数

// 有点类似C的printf,但格式不同。常用的格式有

// s 表示字符串,

// i 表示整型变量,

// f 表示浮点数,

// O 表示一个Python对象。

PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));

PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));

// 调用Python函数

pRetVal

=

PyObject_CallObject

(pFunc, pArgs);

printf("function return value : %ld/r/n", PyInt_AsLong(pRetVal));

Py_DECREF(pName);

Py_DECREF(pArgs);

Py_DECREF(pModule);

Py_DECREF(pRetVal);

// 关闭Python

Py_Finalize();

return 0;

}

//一下为个人实践的另一套方法

#include

<

Python.h

>

#include

<

conio.h

>

int main()

{

Py_Initialize();

if (!Py_IsInitialized())

{

printf("初始化错误/n");

return -1;

}

PyObject*

pModule

=

NULL

;

PyObject*

pFunc

=

NULL

;

PyObject*

pArg

=

NULL

;

PyObject*

pRetVal

=

NULL

;

pModule

=

PyImport_ImportModule

("hello");

pFunc

=

PyObject_GetAttrString

(pModule,"hello");

pArg

=

Py_BuildValue

("(i,i)",33,44);

pRetVal

=

PyObject_CallObject

(pFunc,pArg);

printf("%d/n",PyInt_AsLong(pRetVal));

Py_Finalize();

_getch();

return 0;

}

以上就是我们对C调用Python函数的相关操作方法的介绍。

#include <Python.h>

#include <stdio.h>

void test( void
)

{

PyObject *pMod = NULL;

PyObject *pFun =
NULL;

PyObject *pParm = NULL;

PyObject *pRetVal = NULL;

int iRetval = 0;

if ( pMod = PyImport_ImportModule( "add" )
)

{

if ( pFun = PyObject_GetAttrString( pMod, "add" )
)

{

pParm = PyTuple_New( 2 );

PyTuple_SetItem( pParm, 0, Py_BuildValue( "i", 300 ) );

PyTuple_SetItem( pParm, 1, Py_BuildValue( "i", 500 ) );

pRetVal = PyEval_CallObject( pFun, pParm );

PyArg_Parse(
pRetVal, "i", &iRetval );

printf( "result: %d/n",
iRetval );

}

else

printf( "Not
found fun!/n" );

}

else

printf( "Not found
module!/n" );

}

int main( void )

{

Py_Initialize();

&n
......

Ubuntu下首先要配置下环境;sudo apt-get install python-dev

以下是一个简单的例子:

#include "/usr/include/python2.5/Python.h"

#include <stdio.h>

int main(int arg,char **argv){

PyObject *modelname,*model,*dict,*func,*args;

char *name="os";//模块名

//初始化Python

Py_Initialize();

if (!Py_IsInitialized()){

printf("初始化失败/n");

return -1;

}

//直接运行Python语句

PyRun_SimpleString("print '初始化成功'");

//导入Python模块

modelname=PyString_FromString(name);

model=PyImport_Import(modelname);

if (model){

printf("Load model ok/n");

}

else{

printf("Model %s not found!/n",name);

return -1;

}

dict=PyModule_GetDict(model);

if(!dict){

printf("获取字典失败/n");

return -1;

}

else{

printf("获取字典成功/n");

}

//从模块中找到“System”函数

func=PyDict_GetItemString(dict,"system");

if(!func || !PyCallable_Check(func)){

printf("函数无效/n");

return -1;

}

args=PyTuple_New(1);

PyTuple_SetItem(args,0,Py_BuildValue("s","ls"));//l=long,s=string...

//调用函数

PyObject_CallObject(func,args);

Py_DECREF(modelname);

Py_DECREF(model);

Py_DECREF(func);

Py_DECREF(args);

Py_DECREF(dict);

//垃圾回收

Py_Finalize();

return 0;

}

下面就是编译连接生成可执行文件。

下面是用Python写的编译脚本。

#!/usr/bin/env python

import os

import sys

f=raw_input("C/C++ File:");

out=raw_input("Output file:");

sys.stdout.write("Trying to Complie C File using gcc.../n");

sys.stdout.write("---------------------------------------------------------/n");

if out=='' or out==None:

os.system("gcc "+f +" -L/usr/lib/python2.5/config -lpython2.5
-lpthread -lm -ldl -lutil");

else:

os.system("gcc "+f +" -L/usr/lib/python2.5/config -lpython2.5
-lpthread -lm -ldl -lutil "+"-o "+out);

sys.stdout.write("---------------------------------------------------------/n");

sys.stdout.write("Done!/n");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: