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-OOcompileall.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>
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;
// 把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_Initialize();
PyRun_SimpleString(szCmd);
return 0;
}
9. 把python25.dll放到d:\dist目录中。
1.3. 结束语
这样来,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-3.10.11-amd64.exe
### 手动制作Python的EXE可执行程序 #### 一、引言 在Python开发过程中,有时我们需要将脚本程序打包成独立的.EXE文件以便于分发和执行。然而,Python本身并不具备直接将脚本转换为EXE文件的功能,这在一定程度上...
8. `python.exe`:这是Python的可执行文件,用户可以直接运行它来启动Python命令行或者执行Python脚本。 这些文件的组合使得开发者能够在不完全安装Python的情况下,仍然可以运行Python 3.8的程序。这对于便携式...
这个“python-3.9.10-amd64.exe”安装包就是为Windows用户设计的,旨在提供一个便捷的方式去安装Python环境。 首先,我们来了解一下Python 3.9.10的关键特性。这个版本包含了一些性能改进和错误修复,确保了代码...
"python-3.9.10-amd64.exe" 是Python 3.9.10版本针对AMD64架构(也称为x86_64或64位)的Windows操作系统提供的安装程序。这个安装包确保用户能够在Windows环境下快速便捷地安装Python 3.9.10。 Python 3.9.10是...
企业编码管理的程序-python源码-可执行程序-论文.zip 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时,只需要输入...
python-3.10.1-amd64.exe python-3.10.2-amd64.exe python-3.9.10-embed-amd64.zip python-3.9.10-amd64.exe python-3.10.1-embed-amd64.zip python-3.10.2-embed-amd64.zip
总之,"python-3.11.5-embed-amd64.zip"是一个针对64位Windows系统的Python精简版,包含了运行Python程序所需的基本组件。通过这个压缩包,开发者可以创建独立的Python运行环境,提高软件的可移植性和部署效率。
python-3.9.9-amd64.exe
学生管理系统的程序-python源码-可执行程序-论文.zip 《学生信息管理系统》程序使用说明 在IDLE中运行《学生信息管理系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。...
总的来说,Python 3.12.0-embed-amd64.zip 是为了简化部署和执行Python应用而设计的,特别是对于那些不需要完整Python环境的轻量级应用或独立可执行程序而言,它提供了一种高效且方便的解决方案。
python-3.11.9-amd64.exe.cab
标题 "python-3.9.9-embed-amd64.zip" 暗示这是一个针对64位Windows系统的Python 3.9.9嵌入式版本的压缩包。这个压缩包包含了运行Python程序所需的多个核心组件和依赖库,使得用户可以在不完整安装Python解释器的...
这个压缩包包含了两个版本的MySQL-python安装程序:一个适用于32位系统(MySQL-python-1.2.3.win32-py2.7.exe),另一个适用于64位系统(MySQL-python-1.2.3.win-amd64-py2.7.exe)。这两个文件都是为Python 2.7版本...
全名:python-3.8.4rc1-amd64.exe python的安装与使用: https://blog.csdn.net/qq_38161040/article/details/87295245
原来是通过命令行下载的docx安装包还没有完全兼容python3,估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包...
全名:python-3.7.1rc1-amd64.exe python的安装与使用: https://blog.csdn.net/qq_38161040/article/details/87295245
Python 3.9.13 是 Python 语言的一个重要版本,发布于2022年5月17日。此版本适用于现代操作系统,但不支持Windows 7或更早的操作系统,这意味着如果你的电脑运行的是这些旧版Windows,将无法安装和使用这个Python...
Python是非常流行的程序脚本语言,广泛用于互联网应用,科学计算,人工智能等领域。本下载包为本人从官网下载的,主要供国内网速慢的用户下载,版本为Python-3.7.7-amd64.exe Windows 64位安装包