手动实现把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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
Python学习笔记_数据排序方法
May 22 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
python处理写入数据代码讲解
Oct 22 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
Github 使用python对copilot做些简单使用测试
Apr 14 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 PDO函数库详解
2010/04/27 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
Python中join和split用法实例
2015/04/14 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
python实现车牌识别的示例代码
2019/08/05 Python
使用Python的turtle模块画国旗
2019/09/24 Python
如何在python中写hive脚本
2019/11/08 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
重阳节登山活动方案
2014/02/03 职场文书
企业业务员岗位职责
2014/03/14 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
文化建设工作方案
2014/05/12 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
自我管理的活动方案
2014/08/25 职场文书
六年级学生期末评语
2014/12/26 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js