- 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");