c语言调用Python脚本-2 - Cpper - C++博客
c语言调用Python脚本-2
python代码二段:
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);buffer是python源码字符串
PyObject* m = PyImport_ExecCodeModule("a.a",o);
PyObject* d = PyModule_GetDict(m);
在python2.7中执行正常