手动实现把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 socket 超时设置 errno 10054
Jul 01 Python
Python编程求质数实例代码
Jan 31 Python
Python实现购物车程序
Apr 16 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
django url到views参数传递的实例
Jul 19 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
python列表推导式入门学习解析
Dec 02 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
python利用opencv实现颜色检测
Feb 23 Python
python爬取豆瓣电影TOP250数据
May 23 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 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面向对象程序设计之对象生成方法详解
2016/12/02 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
理解python多线程(python多线程简明教程)
2014/06/09 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python复制文件到指定目录的实例
2018/04/27 Python
python实现微信小程序自动回复
2018/09/10 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
Python中Selenium库使用教程详解
2020/07/23 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
安全口号大全
2014/06/21 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
学生检讨书
2015/01/27 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
土建技术员岗位职责
2015/04/11 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书