加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

(原创)MFC工程中嵌入python 并制作python免安装的安装包

(2014-11-19 17:24:31)
标签:

股票

分类: VC

    python版本 : python2.7.1

    MFC工程开发环境: VS2008    

 

   安装python解释器后,默认安装在C盘,目录如下

 

     目录中有DLLs, include,Lib,libs等。

  

MFC DLL中嵌入python的方法:

 

    在MFC 扩展DLL中嵌入python,这里采用的对动态库Python27.dll 的静态链接方式。

    在MFC DLL工程中加入对python include目录下头文件的引用,添加对python27.lib链接。

     可以参考其它帖子介绍C/C++中嵌入python的方法:

             先初始化  :   Py_Initialize();

             下面这个操作对后续做python免安装包比较重要:

               PyRun_SimpleString("import sys");
               PyRun_SimpleString("sys.path.append('.\')");

            把python文件作为一个module加载:

                           PyObject *pModule =  PyImport_ImportModule("modulename");

           获取python脚本中的函数:

                           PyObject_GetAttrString(pModule ,"funcname");

           调用函数,给函数传参数时要根据实际情况组合使用不同的接口:

                           若函数参数是list,PyObject *pyParams = PyList_New(nNum);

                                                          PyObject *pArg = Py_BuildValue("I", pData[i]);  (要注意数据类型)

                                                         PyList_SetItem(pyParams, i, pArg);

                                                         PyObject *args = PyTuple_New(1);
                                                         PyTuple_SetItem(args,0,pyParams);

                                      PyObject *pyValue =PyEval_CallObject(m_pGetFuncNameByAddressFunc, args);

                            若返回也是list:

                                            Py_ssize_t funcNameNum =PyList_Size(pyValue);

                                           for (int j = 0;j < funcNameNum;j++)
                                           {
                                             PyObject *pyVal =  PyList_GetItem(pyValue,j);
                                             if (pyVal == NULL)
                                             {
                                              return FALSE;
                                             }
                                             char* name=NULL;
                                             PyArg_Parse(pyVal,"s",&name);  

                                             CString strFunc(name);
                                             strFuncNameArray.InsertAt(j,strFunc);
                                            }

  

 制作python免安装的安装包:

           可以用py2exe 或者pyinstaller。下面介绍py2exe的方法。py2exe需找与python版本一致的版本,这里可以参考其它py2exe的帖子。

           安装py2exe后, 做一个setup.py,内容可参考如下:

import py2exe
from distutils.core import setup

setup(console=['py1.py'])
#setup(console=['py1.py','py2.py'])   -----多个py脚本,用逗号分隔

 

        在cmd下 目录切到python安装目录。通过命令 python setup.py  py2exe  (这里setup.py的目录若不在python安装目录下也得用全路径)

        生成的dist目录下有需要用到的python库文件,注意把Library.zip名字改成Python27.zip。把dist目录copy到制作安装包的文件目录下,添加进去即可。

 

那么,可能出现的问题来了,在MFC DLL里嵌入python时,这么打包后,在不安装python的机器上运行时,程序会退出,debug后会发现是出现内存错误。错误点在Py_Initialize();。注意这里是因为py2exe生成的lib包Library.zip里少了两项重要的库文件,site.pyc  和  sysconfig.pyc。从python安装的目录的Lib下找到这两个文件。  把这两个文件添加到Library.zip中。

        添加文件到Library.zip的方法还是记录下,Library.zip解压缩到Library目录,把site.pyc  和  sysconfig.pyc复制到Library目录,  然后在Library目录下CTRL +A 全选,  右键 菜单中选择添加到Library.zip。不是把Library目录直接压缩成zip。      

      

                              

                    

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有