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就可以了。

转载于:https://www.cnblogs.com/starspace/archive/2008/10/22/1317134.html

手工将python程序发布为exe执行程序 [转]相关推荐

  1. python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程

    python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程 参考文章: (1)python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程 ...

  2. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)

    python程序打包成exe可执行文件,亲测可行(pyinstaller教程)(11-20190214) 文章目录: 有些程序你不想让别人看到,由此程序你想做成绿色软件普惠大众,有些..., 然而你只 ...

  3. Pyinstaller将Python程序打包成EXE(多种模式的打包)

    Pyinstaller将Python程序打包成EXE 文章目录 Pyinstaller将Python程序打包成EXE 安装 安装 pip install pyinstaller 博文已经迁移到个人主页 ...

  4. python程序打包为exe可执行文件

    大家都知道,Python是一种脚本语言,也就是解释型的语言,需要解释器来进行解释以后才可以执行,而Python源代码需要在Python虚拟机上面运行,但是我们做好的程序,不可能给用户使用的时候还让他安 ...

  5. 将python程序打包成exe

    将python程序打包成exe,这样我们下次想要实用自己写的python时,就不需要打开python或者编辑器了,可以直接点了exe运行,是个比较实用的功能. 参考链接:https://www.cnb ...

  6. 复制粘贴,快速将Python程序打包成exe

    大家好,我是菜鸟哥. 为了将Python程序发送给不懂代码和没有安装Python的同事.朋友使用,最好的方式就是将Python程序打包成exe可执行文件,再发送给他们. 我之前曾经打包过几次,操作并没 ...

  7. mac python3打包成窗体程序_使用pyinstaller将python程序打包成exe/苹果软件的方法与异常解决 - pytorch中文网...

    一.安装pyinstaller 通过清华镜像安装比较快 # 二者选其一执行,第二条快 pip3 installer pyinstaller # 清华镜像安装 # pip3 install -i htt ...

  8. 本文一步一步地教你如何将Python程序打包成exe文件—赶紧进来学习吧

    [先来看看几个问题] 一.什么是exe可执行文件? exe文件英文全名是executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种 ...

  9. 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)

    目录 打包前置知识 一.什么是exe可执行文件? 二.为什么要将 Python 程序打包为 exe 可执行文件? 三.为什么 Python 程序不能直接运行呢? 四.我们用什么来打包 Python 文 ...

最新文章

  1. Synchronization (computer science)
  2. Invalid config event received: {version=0, server
  3. linq、lambda、entity framework之间的关系
  4. 33. 高精度练习之乘法
  5. Matplotlib作业3
  6. oracle转mysql总结,原理+实战+视频+源码
  7. vue 动态添加路由
  8. UnityShader10:CG标准函数库
  9. s7五杀大数据英雄_大数据公布新赛季拿五杀最多的英雄,韩信垫底,她却拿到手抽筋!...
  10. docker搭建python开发环境_PyCharm使用之利用Docker镜像搭建Python开发环境
  11. mysql的replication(主从同步)总结
  12. svn之回滚到指定版本
  13. Linux修改open files数及ulimit和file-max的区别
  14. 射频day5:波导为什么noTEM;相速 相波长 群速 波阻抗
  15. CTF挑战赛-合天网安实验室-Reverse逆向100writeup
  16. 新视野大学英语读写2 78单元翻译
  17. QT - 图像处理 ( 1 ) - QImage像素级操作 - (转灰度、亮度、暖色、冷色、饱和度、模糊、锐化、金属效果 )
  18. MySql小数点处理
  19. Mysql数据库数据拆分之分库分表总结
  20. TTL、RS232、485到底能传输多远距离?

热门文章

  1. 逆元~(乘法逆元及其应用)
  2. tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm.的一种解决方法
  3. c语言两个数组按位合并,合并两个线性表(数组)并按照非递减排序输出,有点问题过来看看...
  4. ANDROID: 超级好用的ADB FORWARD命令
  5. Android系统中的进程管理:进程的优先级
  6. JZOJ 3401 JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法
  7. 单刹车信号不合理故障_关于汽车制动系统有哪些故障?该如何解决?
  8. 打开有视频的文件夹~~当遇到某些特定的视屏格式就会出现Activemovie Window:Explorer.EXE-应用程序错误
  9. AtCoder AGC017C Snuke and Spells
  10. mysql数据库崩溃恢复_MySQL数据库表维护和崩溃恢复