VC内嵌Python脚本

 前言:
(tcl 在国内似乎很少有人用,据说因为用的人少,所以中文方面的资料非常少的

python 好像比较好学的,而且用户群比TCL perl 要多,中文资料也蛮多的了,我也在学python)


1. 安装Python2.6.1到C:/python26
2. 用VC2008(VC6.0不行)新建一个VC项目, 在Project Setting中,把C:/python/include加入“其他头文件”那一项,
  把c:/python/libs加入link的附加目录里。
 
一个简单的控制台工程的源代码:
#include "stdafx.h"
#include "Python.h"

int main(int argc, char* argv[])
{
 char *psz = NULL;

 //初始化python.Python Init 
 Py_Initialize();  
 if(!Py_IsInitialized())
 {
  printf("can't init python.");
  return 0;
 }

 //PyRun_SimpleString("import   sys");
 //PyRun_SimpleString("sys.path.append('./ ')");
 PyObject   *pName,*pModule,*pDict,*pFunc,*pArgs, *pRes;


 //这个就是你要嵌入的python文件名.
 pName = PyString_FromString("pytest");  
 

 //得到该python文件的模块.
 pModule = PyImport_Import(pName);
 if(!pModule)
 {
  printf("can't find pytest.py");
  return 0;
 }


 //得到python模块中的函数表集合.
 pDict = PyModule_GetDict(pModule);     
 if(!pDict)
 {
  return 0;
 }


 //得到特定的函数项.
 pFunc = PyDict_GetItemString(pDict, "add");
 if(!pFunc || !PyCallable_Check(pFunc))
 {
  printf("can 't   find   function   [add]");
  return 0;
 }


 //添参数.
 pArgs   =   PyTuple_New(2);
 PyTuple_SetItem(pArgs,0,Py_BuildValue("l", 100));
 PyTuple_SetItem(pArgs,1,Py_BuildValue("l", 200));

 
 //调用python程序去执行函数
 PyObject_CallObject(pFunc ,pArgs);   

 
 //另外一个函数例子,演示了如何向python传递参数,和如何传回C++
 pFunc   =   PyDict_GetItemString(pDict, "str_find");
 if(!pFunc   ||   !PyCallable_Check(pFunc))
 {
  printf("can't find function [str_find]");
  return 0;
 }

 pArgs   =   PyTuple_New(2);
 PyTuple_SetItem(pArgs,0,Py_BuildValue( "s", "abcdef"));
 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);


  //清除. uninti python
 Py_Finalize();      


 printf("Hello World!/n");
 return 0;
}

 

//python源文件:python.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)


//OK, 程序运行OK,接下来就要把该工程打包,这比较麻烦,我也弄的好久才OK.
1)首先利用py2exe将pytest.py编译为可执行程序:
 写个setup.py文件:
      from distutils.core import setup
  import py2exe
  setup(console=['D:/Program VC6/TestPython/Release/pytest.py'])
 输入C:/Python26>python "D:/Program VC6/TestPython/Release/setup.py" py2exe
  该目的是利用其中生成的python26.dll(这个所有对于所有的python脚本都一样吧)和library.zip(不同脚本生成不同的库文件)。

2)发布VC编译生成的程序时,需要以下文件:

可执行程序:pytest.exe;
dll:python26.dll;
python脚本:pytest.py;
库文件:python26.zip(将library.zip重命名为python26.zip,程序默认调用这个名字的库文件)。

3)放到一个无python环境的机器中,测试成功。

So Now,可以发布调用python的VC程序了!

 

你可能感兴趣的:(python,function,脚本,exe,import,Tcl)