手动实现把python项目发布为exe可执行程序过程分享


Posted in Python onOctober 23, 2014

1. 手动制作python的exe可执行程序Python没有内建一个编译为exe的功能。给python程序的部署带来不少的麻烦。所以就会出现一些py2exe之类的很不错的工具,用于自动把.py文件编译为.exe文件。

最近抽空研究了一下手动实现类似py2exe的功能,希望加强对python的了解。结果还相当不错。把结果记录下来,与大家共享。

1.1. 原理文中所描述的方法,基于python的以下几个功能 

  1) python程序运行时,会在sys.path指定的路径中查找库文件。 
  2) python从2.3开始,支持从zip文件中import库(支持.py,.pyc和.pyo,但不支持.pyd)
  3) python提供C API,让c语言的程序,可以很方便的调用python的程序

1.2. 实际步骤注:假设python安装在c:\python25目录中,最后的可执行文件放到d:\dist目录中 

  1) 先去c:\python25\Lib目录,把所有文件都复制出来,比如复制到d:\pythonlib目录中
  2) 开一个cmd窗口,进入d:\pythonlib目录中,运行 python -OO compileall.py -f . 把lib中的.py文件都编译成.pyo文件
  3) 删除d:\pythonlib目录中所有的.py和.pyc文件,因为我们只要有.pyo文件就可以让这些库运行了。
  4) 删除目录中所有用不着的文件,比如curses,test,idlelib,msilib等,以减少生成文件的体积。
  5) 把这些库打包成一个zip文件,比如stdlib.zip,放到d:\dist目录中
  6) 把c:\python25\dlls目录中的.pyd和.dll文件,复制到d:\dist\dlls目录中,当然,删除不可能用到的一些文件_msi.pyd,_ssl.pyd等等,可以减少文件的体积
  7) 把自己写的程序,也按步骤2至步骤5所说的方法,打成一个mysrc.zip包,放到d:\dist目录中。 注意:自己写的程序的入口应该是main.pyo文件
  8) 用以下C程序编译出一个可执行文件,比方说叫runpy.exe,也放到d:\dist中。

#include <Python.h>

#include <Windows.h>

#include <stdlib.h>

#include <stdio.h>
int main()

{

       // 得到当前可执行文件所在的目录

       char szPath[10240];

       char szCmd[10240];

       GetModuleFileName(NULL, szPath, sizeof(szPath));

       char* p = strrchr(szPath, '\\');

       if (p == NULL)

       {

            printf("Get module file name error!\n");

            return -1;

       }
       *p = 0;
       // 设定运行时的PATH

       sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);

       _putenv(szCmd);
       // 把sys.path设定为['.', '自己的源代码zip文件', '标准库zip文件', 'dll目录']

       // 然后调用main模块

       sprintf(szCmd,

            "import sys\n"

            "sys.path=['.', r'%s\\mysrc.zip', r'%s\\stdlib.zip', r'%s\\dlls']\n"

            "import main\n",

            szPath, szPath, szPath);

      

       Py_OptimizeFlag = 2;

       Py_NoSiteFlag = 1;

       Py_Initialize();

       PyRun_SimpleString(szCmd);

       return 0;

}

9. 把python25.dll放到d:\dist目录中。

结束语

这样来,d:\dist目录中,一共只有4个文件加一个目录:
dlls目录:用于存放所有的dll文件和pyd文件
stdlib.zip文件:用于存放所有的python的.pyo文件格式的标准库
mysrc.zip文件:用于存放自己写的程序。注意,自己写的程序的入口在main.pyo中。
runpy.exe文件:程序的启动文件,启动后会设定python的sys.path,然后调用main模块
python25.dll文件:python的核心dll,runpy.exe依赖于这个dll

--------------------------------------------------------------------------------

哈哈,相当的简洁明了吧。一共才4个文件一个目录,5MB都不到哦。
注:当然,这种打包方式第一次做的时候比较麻烦,但之后就可以只要把自己的程序打包就好了,其它的不用变。
而且,如果自己的程序经常做改动的话,自己的程序也可以不打包,直接放到d:\dist中,反正runpy.exe启动程序的时候,只要能正常运行import main就可以了。

Python 相关文章推荐
python插入数据到列表的方法
Apr 30 Python
Python使用bs4获取58同城城市分类的方法
Jul 08 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python 登录网站详解及实例
Apr 11 Python
python实现傅里叶级数展开的实现
Jul 21 Python
浅谈django orm 优化
Aug 18 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
Python实战之制作天气查询软件
May 14 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python Scrapy框架原理解析
Jan 04 Python
python文件操作整理汇总
Oct 21 #Python
Python中input和raw_input的一点区别
Oct 21 #Python
Python中if __name__ == &quot;__main__&quot;详细解释
Oct 21 #Python
Python创建文件和追加文件内容实例
Oct 21 #Python
python3生成随机数实例
Oct 20 #Python
Python入门篇之面向对象
Oct 20 #Python
Python入门篇之数字
Oct 20 #Python
You might like
PHP新手上路(十三)
2006/10/09 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
js实现的网页颜色代码表全集
2007/07/17 Javascript
Javascript typeof 用法
2008/12/28 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python复制文件操作实例详解
2015/11/10 Python
深入理解python中的select模块
2017/04/23 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Flask-Mail用法实例分析
2018/07/21 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
房产代理公证处委托书
2014/04/04 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
起诉状范本
2015/05/20 职场文书
毕业实习感受与体会
2015/05/26 职场文书
教务处教学工作总结
2015/08/10 职场文书
校园安全主题班会
2015/08/12 职场文书
公司与个人合作协议书
2016/03/19 职场文书