手工将python程序发布为exe执行程序 [转]
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执行程序 [转]相关推荐
- python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程 参考文章: (1)python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程 ...
- python程序打包成exe可执行文件,亲测可行(pyinstaller教程)
python程序打包成exe可执行文件,亲测可行(pyinstaller教程)(11-20190214) 文章目录: 有些程序你不想让别人看到,由此程序你想做成绿色软件普惠大众,有些..., 然而你只 ...
- Pyinstaller将Python程序打包成EXE(多种模式的打包)
Pyinstaller将Python程序打包成EXE 文章目录 Pyinstaller将Python程序打包成EXE 安装 安装 pip install pyinstaller 博文已经迁移到个人主页 ...
- python程序打包为exe可执行文件
大家都知道,Python是一种脚本语言,也就是解释型的语言,需要解释器来进行解释以后才可以执行,而Python源代码需要在Python虚拟机上面运行,但是我们做好的程序,不可能给用户使用的时候还让他安 ...
- 将python程序打包成exe
将python程序打包成exe,这样我们下次想要实用自己写的python时,就不需要打开python或者编辑器了,可以直接点了exe运行,是个比较实用的功能. 参考链接:https://www.cnb ...
- 复制粘贴,快速将Python程序打包成exe
大家好,我是菜鸟哥. 为了将Python程序发送给不懂代码和没有安装Python的同事.朋友使用,最好的方式就是将Python程序打包成exe可执行文件,再发送给他们. 我之前曾经打包过几次,操作并没 ...
- mac python3打包成窗体程序_使用pyinstaller将python程序打包成exe/苹果软件的方法与异常解决 - pytorch中文网...
一.安装pyinstaller 通过清华镜像安装比较快 # 二者选其一执行,第二条快 pip3 installer pyinstaller # 清华镜像安装 # pip3 install -i htt ...
- 本文一步一步地教你如何将Python程序打包成exe文件—赶紧进来学习吧
[先来看看几个问题] 一.什么是exe可执行文件? exe文件英文全名是executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种 ...
- 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)
目录 打包前置知识 一.什么是exe可执行文件? 二.为什么要将 Python 程序打包为 exe 可执行文件? 三.为什么 Python 程序不能直接运行呢? 四.我们用什么来打包 Python 文 ...
最新文章
- Synchronization (computer science)
- Invalid config event received: {version=0, server
- linq、lambda、entity framework之间的关系
- 33. 高精度练习之乘法
- Matplotlib作业3
- oracle转mysql总结,原理+实战+视频+源码
- vue 动态添加路由
- UnityShader10:CG标准函数库
- s7五杀大数据英雄_大数据公布新赛季拿五杀最多的英雄,韩信垫底,她却拿到手抽筋!...
- docker搭建python开发环境_PyCharm使用之利用Docker镜像搭建Python开发环境
- mysql的replication(主从同步)总结
- svn之回滚到指定版本
- Linux修改open files数及ulimit和file-max的区别
- 射频day5:波导为什么noTEM;相速 相波长 群速 波阻抗
- CTF挑战赛-合天网安实验室-Reverse逆向100writeup
- 新视野大学英语读写2 78单元翻译
- QT - 图像处理 ( 1 ) - QImage像素级操作 - (转灰度、亮度、暖色、冷色、饱和度、模糊、锐化、金属效果 )
- MySql小数点处理
- Mysql数据库数据拆分之分库分表总结
- TTL、RS232、485到底能传输多远距离?
热门文章
- 逆元~(乘法逆元及其应用)
- tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm.的一种解决方法
- c语言两个数组按位合并,合并两个线性表(数组)并按照非递减排序输出,有点问题过来看看...
- ANDROID: 超级好用的ADB FORWARD命令
- Android系统中的进程管理:进程的优先级
- JZOJ 3401 JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法
- 单刹车信号不合理故障_关于汽车制动系统有哪些故障?该如何解决?
- 打开有视频的文件夹~~当遇到某些特定的视屏格式就会出现Activemovie Window:Explorer.EXE-应用程序错误
- AtCoder AGC017C Snuke and Spells
- mysql数据库崩溃恢复_MySQL数据库表维护和崩溃恢复