// python_c++_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//#include "Python_h/Python.h"
/************************************************************************/
/* 运
行函数
/*  PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, 
PyCompilerFlags *);
/* PyAPI_FUNC(int) PyRun_AnyFileExFlags(FILE *, 
const char *, int, PyCompilerFlags *);
/* PyAPI_FUNC(int) 
PyRun_SimpleStringFlags(const char *, PyCompilerFlags *);
/* PyAPI_FUNC(int)
 PyRun_SimpleFileExFlags(FILE *, const char *, int, PyCompilerFlags *);
/* PyAPI_FUNC(int)
 PyRun_InteractiveOneFlags(FILE *, const char *, PyCompilerFlags *);
/* PyAPI_FUNC(int)
 PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags 
*);                                                                     
*/
/************************************************************************/
#ifdef
 WIN32
 #include "Python_h/Python.h" //windows平台下
#else
 #include
 "/usr/src/Python-2.4/Include/Python.h"  //linux平台下
#endif
int _tmain(int argc, _TCHAR* argv[])
{
 PyObject 
*pName,*pModule,*pDict,*pFunc,*pArgs,*pValue;
 Py_Initialize();
 //
设置环境变量
#ifdef WIN32
 PyRun_SimpleString("import 
sys");//python执行字符串
 PyRun_SimpleString("sys.path.append('./Python_script')");
//
  PyRun_SimpleString("import os");
//  PyRun_SimpleString("import 
string");
#endif 
 //加载模块
 pModule=PyImport_ImportModule("aaa");
 //pArgs=PyObject_CallMethod(pModule,"max","ii",2,3);
 
 
 //获取函数
 pFunc=PyObject_GetAttrString(pModule,"max");
 //
调用函数
 pArgs=PyObject_CallFunction(pFunc,"ii",10,80);
 printf("%d",PyLong_AsLong(pArgs));
 Py_Finalize();
 /************************************************************************/
 /*
 以下是另一种加载python模块的方法
 //pName=PyString_FromString("test");
 //pModule=PyImport_Import(pName);
//pDict = PyModule_GetDict(pModule);
//pFunc = PyDict_GetItemString(pDict, "max");
 ////参数进栈
 //pArgs=PyTuple_New(2);
 ////设置参数值
 //PyTuple_SetItem(pArgs,
 0, Py_BuildValue("i",10));
 //PyTuple_SetItem(pArgs, 1, 
Py_BuildValue("i",15));
 ////调用函数
 //pValue=PyObject_CallObject(pFunc,
 pArgs);
 //查找函数
 //pFunc = PyDict_ GetItemString_r(pDict, "max");
                                                                    
 */
 /************************************************************************/
 return
 0;
}
最近项目开发中需要在C++嵌入Python,在C++中嵌入Python能弥补C++本
身的一些缺点,
提高程序灵活性,好处还是很多的。
1、安装Python
1.1 在 Windows上安装Python:
       直接去www.python.org/  
网站下载一个安装包python-2.5.1.msi(最新版本),双击安装文件就可以了。
1.2 在linux上安装Python:
       在linux上开发,最好去http://www.python.org/ftp/python/
 下载原码,
      通过原码安装需要执行configure, make, make install几个步骤,我下载安装的是python-2.4.tgz 。
2、开发的前期工作
       在win32环境,在VC Directories中加入Python安装后的Lib和Include;
       在linux环境 Lib和Include是通过gcc指定。
3.编写Python脚本
    Python函数的编写不难,可以用文本编辑器,也可以用IDLE (Python官方提供)。
    下面是一个简单的2个数相加的python脚本:
def PyAdd(x, y)
     nSum = x + y
     print "Sum = ", nSum
     return nSum
4. C++中调用嵌入的Python脚本
4.1 引入头文件
       win32/linux需要引入Python头文件
       ifdef WIN32
               #include "Python.h"
       #else
               #include "/usr/src/Python-2.4/Include/Python.h"
       #endif
4.2  C++调用Python前需要初始化,程序结束前要关闭Python
         初始化Python      Py_Initialize(); 
关闭Python Py_Finalize();
4.3 linux环境需要在Py_Initialize后引入python库的代码
     #ifndef WIN32
         PyRun_SimpleString("import sys"); 
         PyRun_SimpleString("sys.path.append('./')"); 
         PyRun_SimpleString("import os");
         PyRun_SimpleString("import string");
     #endif
 具体引入什么库根据需要定。
4.4 C++嵌入Python的准备工作做好后的C++编程
        为了调用Python函数扩展性比较好,特写了一个CallPyFunction函数,通过它
      调用Python函数,Python脚本文件名,函数名,参数都有CallPyFunction外传入,
     下面代码为CallPyFunction的核心代码,代码中未包含错误处理
      int CallPyFunction(const 
char *pszModuleName,
                                        const char *pModulFuncName,
                                        const char *pParam[],
                                        const int nCount)
      {
             PyObject *pName = NULL;
             PyObject *pModule = NULL;
             PyObject *pDict = NULL;
             PyObject *pFunc = NULL;
             PyObject *pParams = NULL;
             PyObject *pCurrParam = NULL; 
             int i = 0;
             pName = PyString_FromString(pszModuleName); 
             pModule = PyImport_Import(pName); 
             pDict = PyModule_GetDict(pModule);
             pFunc = PyDict_GetItemString(pDict, pModulFuncName);  
             pParams = PyTuple_New(nCount);
             i = 0;
             while (i < nCount)
             {
                    pCurrParam = PyString_FromString(pParam[i]); 
                    PyTuple_SetItem(pParams, i, pCurrParam); 
                    i++;
              }
              PyObject *pFtp= PyObject_CallObject(pFunc, pParams);
              return true;
      }
5.makefile
  在linux上嵌入Python后,makefile需要加入include和lib,具体如下
          PYTHON_HOME=/usr/src/Python-2.4
          PYTHON_LIBDIR=-L$(PYTHON_HOME)
          PYTHON_INCLUDE=-I$(PYTHON_HOME)
          PYTHON_INCLUDE2=-I$(PYTHON_HOME)/Include
 Include 
和Lib的路径根据实际的安装路径设置,在linux上python安装后,引入的.h文件有的在PYTHON_HOME,也有的在Include,需要
引入2个路径。
 gcc 编译选项加上如下参数 
 $(PYTHON_INCLUDE)   $(PYTHON_INCLUDE2)    $(PYTHON_LIBDIR) -lpython2.4 
-ldl -lpthread -lutil -lm -Xlinker -export-dynamic