python与c语言数据交互,python与c语言交互---学习012

1.C语言是结构化编程语言,Python是面向对象的语言,Python调用C语言,没有问题。但是,反过来则不行,不许C调用Python。

使用Python/C API中的PyImport_Import()函数可以在C程序中导入Python模块。

分析:先引用模块(PyImport_ImportModule),

然后获取模块中的函数(PyObject_GetAttrString),

对c传入python 的参数做类型转换(Py_BuildValue("(s)","hello_python")),

最后直接调用函数并传递参数(PyEval_CallObject)。

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

#include

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;

}------------------------------------------------------------------------我是分割线-------------------------------------------------------

call.py

def

test():

print

'

hello world

'

def

add(a,b):

return

a

+

b

api.py

import io

def load_test():

fp = open('call.py','r')

buffer = ''

if fp:

buffer = fp.read()

fp.close()

return buffer

cpp代码:

#include

<

stdio.h

>

#include

<

stdlib.h

>

#include

<

Python.h

>

int

main(

int

argc,

char

*

argv[])

{

Py_Initialize();

if

(

!

Py_IsInitialized())

{

return

-

1

;

}

PyRun_SimpleString(

"

import sys

"

);

PyRun_SimpleString(

"

sys.path.append('./')

"

);

PyObject

*

pName;

PyObject

*

pModule;

PyObject

*

pDict;

PyObject

*

pFunc;

pName

=

PyString_FromString(

"

api

"

);

pModule

=

PyImport_Import(pName);

if

(

!

pModule)

{

printf(

"

can't find call.py

"

);

getchar();

return

-

1

;

}

pDict

=

PyModule_GetDict(pModule);

if

(

!

pDict)

{

return

-

1

;

}

{

pFunc

=

PyDict_GetItemString(pDict,

"

load_test

"

);

if

(

!

pFunc

||

!

PyCallable_Check(pFunc))

{

printf(

"

can't find function [test]

"

);

getchar();

return

-

1

;

}

PyObject

*

pFn

=

PyObject_CallObject(pFunc,

0

);

char

*

buffer

=

PyString_AsString(pFn);

printf(

"

%s\n

"

,buffer);

PyObject

*

o

=

Py_CompileString(buffer,

"

none

"

,Py_file_input);

PyObject

*

m

=

PyImport_ExecCodeModule(

"

a.a

"

,o);

PyObject

*

d

=

PyModule_GetDict(m);

pFunc

=

PyDict_GetItemString(d,

"

add

"

);

if

(

!

pFunc

||

!

PyCallable_Check(pFunc))

{

printf(

"

can't find function [add]

"

);

getchar();

return

-

1

;

}

PyObject

*

args

=

PyTuple_New(

2

);

PyTuple_SetItem(args,

0

,Py_BuildValue(

"

l

"

,

3

));

PyTuple_SetItem(args,

1

,Py_BuildValue(

"

l

"

,

4

));

PyObject

*

pAdded

=

PyObject_CallObject(pFunc,args);

int

ret

=

PyInt_AsLong(pAdded);

printf(

"

add value:%d\n

"

,ret);

}

Py_Finalize();

system(

"

PAUSE

"

);

return

0

;

}

这段代码和上一篇有点区别

主要区别是从从内存载入python模块然后调用函数

主要部分是这块:

PyObject* o = Py_CompileString(buffer,"none",Py_file_input);

PyObject* m = PyImport_ExecCodeModule("a.a",o);

PyObject* d = PyModule_GetDict(m); buffer是python源码字符串

在python2.7中执行正常

编译:

gcc -o ./python_c_function ./python_c_function.c -I/usr/include/python2.6 -L/usr/lib/python2.6 -lpython

[root@localhost c_python]# ./python_c_function

def test():

print 'hello world'

def add(a,b):

return a + b

add value:7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值