手动实现把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使用MySQLdb for Python操作数据库教程
Oct 11 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
python用户管理系统
Mar 13 Python
python字典快速保存于读取的方法
Mar 23 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
Python中Numpy mat的使用详解
May 24 Python
我就是这样学习Python中的列表
Jun 02 Python
int在python中的含义以及用法
Jun 27 Python
python+logging+yaml实现日志分割
Jul 22 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
详解Python IO口多路复用
Jun 17 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
介绍一些PHP判断变量的函数
2012/04/24 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
javascript动态加载二
2012/08/22 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
python 正则式使用心得
2009/05/07 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
Linux下python制作名片示例
2018/07/20 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python版大富翁源代码分享
2018/11/19 Python
Python中一些深不见底的“坑”
2019/06/12 Python
python将数据插入数据库的代码分享
2020/08/16 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
党建工作先进材料
2014/05/02 职场文书
2015年春节标语口号
2014/12/09 职场文书
2014年司法局工作总结
2014/12/11 职场文书
检讨书模板
2015/01/29 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
Js类的构建与继承案例详解
2021/09/15 Javascript
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL