手动实现把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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
分分钟入门python语言
Mar 20 Python
python交易记录链的实现过程详解
Jul 03 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
pandas分组聚合详解
Apr 10 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
Python如何对齐字符串
Jul 30 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
python 进阶学习之python装饰器小结
Sep 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
TensorFlow如何实现反向传播
2018/02/06 Python
python实现Zabbix-API监控
2018/09/17 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
判断单链表中是否存在环
2012/07/16 面试题
初中女生自我鉴定
2013/12/19 职场文书
单位委托书怎么写
2014/08/02 职场文书
承诺书模板
2014/08/30 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
Python实现排序方法常见的四种
2021/07/15 Python