手动实现把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实现的HTTP并发测试完整示例
Apr 23 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
python实现将内容分行输出
Nov 05 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
Python3实现购物车功能
Apr 18 Python
python版大富翁源代码分享
Nov 19 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
selenium2.0中常用的python函数汇总
Aug 05 Python
Python基于unittest实现测试用例执行
Nov 25 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
python3.9之你应该知道的新特性详解
Apr 29 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
juqery 学习之四 筛选过滤
2010/11/30 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
Flask配置Cors跨域的实现
2019/07/12 Python
Python通过文本和图片生成词云图
2020/05/21 Python
英国著名书店:Foyles
2018/12/01 全球购物
骨干教师培训制度
2014/01/13 职场文书
新学期家长寄语
2014/01/19 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
婚前协议书标准版
2014/10/19 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
详解Oracle块修改跟踪功能
2021/11/07 Oracle