手动实现把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调用shell的方法
Nov 20 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
python与字符编码问题
May 24 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
python Django的web开发实例(入门)
Jul 31 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
Python实现猜拳与猜数字游戏的方法详解
Apr 06 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
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
点击进行复制的JS代码实例
2013/08/23 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
JS中去掉array中重复元素的方法
2017/05/26 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
python 实现归并排序算法
2012/06/05 Python
Python实现Const详解
2015/01/27 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
python实现文本界面网络聊天室
2018/12/12 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python中有关时间日期格式转换问题
2019/12/25 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python中round函数如何使用
2020/06/19 Python
Python实现一个优先级队列的方法
2020/07/31 Python
python打包生成so文件的实现
2020/10/30 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
作风整顿个人剖析材料
2014/10/06 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
2015年安全月活动总结
2015/03/26 职场文书
导游词之五台山
2019/10/11 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis