手动实现把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基础教程之Hello World!
Aug 29 Python
Python多线程下载文件的方法
Jul 10 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
元组列表字典(莫烦python基础)
Apr 03 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
Python2与Python3的区别详解
Feb 09 Python
Python如何实现邮件功能
May 27 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 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
处理php自动反斜杠的函数代码
2010/01/05 PHP
php汉字转拼音的示例
2014/02/27 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
Djang中静态文件配置方法
2015/07/30 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
如何在Python对Excel进行读取
2020/06/04 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
经典c++面试题四
2015/05/14 面试题
读群众路线心得体会
2014/03/07 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
房屋出租协议书
2014/04/10 职场文书
世界读书日的活动方案
2014/08/20 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
材料物理专业求职信
2014/09/01 职场文书
2014年德育工作总结
2014/11/20 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
详解Python requests模块
2021/06/21 Python