转:python嵌⼊代码⽰例
#include <Python.h>
int
main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
int i;
if (argc < 3) {
fprintf(stderr,"Usage: call pythonfile funcname [args]n");
return 1;
}
Py_Initialize();
pName = PyString_FromString(argv[1]);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, argv[2]);
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(argc - 3);
for (i = 0; i < argc - 3; ++i) {
pValue = PyInt_FromLong(atoi(argv[i + 3]));
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
fprintf(stderr, "Cannot convert argumentn");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL) {
printf("Result of call: %ldn", PyInt_AsLong(pValue));
Py_DECREF(pValue);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failedn");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function \"%s\"n", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
fprintf(stderr, "Failed to load \"%s\"n", argv[1]);
return 1;
}
Py_Finalize();
return 0;
}
这段代码从argv[1]中载⼊Python脚本,并且调⽤argv[2]中的函数,整数型的参数则是从argv数组后⾯得来的。如果编译和链接这个程序,执⾏如下脚本:
def multiply(a,b):
print "Will compute",a,"times",b
c=0
for i in range(0,a)
c=c+b
return c
结果将是:
$ call multiply multiply 3 2
Will compute 3 times 2
Result of call: 6
虽然这个程序的代码挺多的,但是⼤部分其实都是做数据转换和错误报告。主要关于嵌⼊Python的开始于:
Py_Initialize();
pName=PyString_FromString(argv[1]);
/* Error checking of pName left out */
pModule=PyImport_Import(pName);
初始化解释器之后,使⽤ PyImport_Import() 导⼊模块。这个函数需要字符串作为参数,使⽤ PyString_FromString() 来构造:
pFunc=PyObject_GetAttrString(pModule,argv[2]);
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
...
}
Py_XDECREF(pFunc);
载⼊了模块以后,就可以通过 PyObject_GetAttrString() 来获取对象。如果名字存在并且可以执⾏则可以安全的调⽤它。程序随后构造参数元组,然后执⾏调⽤:
pValue=PyObject_CallObject(pFunc,pArgs);
函数调⽤之后,pValue要么是NULL,要么是返回值的对象引⽤。注意在检查完返回值之后要释放引⽤。
另⼀个:
1.    安装  Python  到  d:\python23
2.    新建⼀个VC项⽬,在  Project  Setting    中,把  d:\python\include  加⼊“其他头⽂件”哪⼀项,把  d:\python\libs  加⼊  link  的附加⽬录⾥。
3.    在主⽂件⾥这样写:
#include  <python.h>      //  PYthon  头⽂件
#include  <stdio.h>
void  main(void)
{
Py_Initialize();                      //python  解释器的初始化
if(!Py_IsInitialized())
{
printf( "can 't  init  python ");
return;
}
PyRun_SimpleString( "import  sys ");
PyRun_SimpleString( "sys.path.append( './ ') ");
PyObject  *pName,*pModule,*pDict,*pFunc,*pArgs,*pRes;
pName  =  PyString_FromString( "pytest ");        //  这个就是你要嵌⼊的python  ⽂件名
pModule  =  PyImport_Import(pName);
if(!pModule)
{
printf( "can 't  find  pytest.py ");
getchar();
return  ;
}
pDict  =  PyModule_GetDict(pModule);    //  得到python模块中的函数表
if(!pDict)
return;
pFunc  =  PyDict_GetItemString(pDict, "add ");
if(!pFunc  ||  !PyCallable_Check(pFunc))
{
printf( "can 't  find  function  [add] ");
getchar();
return;
}
*pArgs;
//    添参数
pArgs  =  PyTuple_New(2);
PyTuple_SetItem(pArgs,0,Py_BuildValue( "l ",343));
PyTuple_SetItem(pArgs,1,Py_BuildValue( "l ",42356));
PyObject_CallObject(pFunc  ,  pArgs);          //  调⽤  python  程序
pFunc  =  PyDict_GetItemString(pDict, "str_find ");
if(!pFunc  ||  !PyCallable_Check(pFunc))
{
printf( "can 't  find  function  [add] ");
getchar();
return;
}
//  另外⼀个函数例⼦,演⽰了如何向  python  传递参数,和如何传回  C++ pArgs  =  PyTuple_New(2);
PyTuple_SetItem(pArgs,0,Py_BuildValue( "s ", "abcdef "));python新手代码示例
PyTuple_SetItem(pArgs,1,Py_BuildValue( "s ", "de "));
long  ret_val  =  PyInt_AsLong(PyObject_CallObject(pFunc  ,  pArgs));
printf( "%d\n ",ret_val);
Py_DECREF(pModule);
Py_Finalize();                      //  清除
getchar();
}
//  -----------------------------------------
python  ⽂件    pytest.py
def  add(a,b):
print  "in  python  function  add "
print  a+b
return
def  str_find(str1,str2):
print  "str1: ",str1
print  "str2: ",str2
return  str1.rfind(str2)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。