手动实现把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 27 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
python多线程http压力测试脚本
Jun 25 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
django中间键重定向实例方法
Nov 10 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
python变量的作用域是什么
May 26 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 Python
Python中相见恨晚的技巧
Apr 13 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 $_SERVER详解
2009/01/16 PHP
php csv操作类代码
2009/12/14 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
跨浏览器的事件对象介绍
2012/06/27 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
微信小程序实现消息框弹出动画
2020/04/18 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
js实现随机点名
2021/01/19 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Selenium控制浏览器常见操作示例
2018/08/13 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
2014年五四青年节活动方案
2014/03/29 职场文书
努力学习演讲稿
2014/05/10 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
食品安全演讲稿
2014/09/01 职场文书
股指期货心得体会
2014/09/10 职场文书
2015年质检工作总结
2015/05/04 职场文书
舞出我人生观后感
2015/06/16 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
同学聚会开幕词
2019/04/02 职场文书