手动制作python的exe可执行程序 -- by Leo Jay

简介:

Python没有内建一个编译为exe的功能。给python程序的部署带来不少的麻烦。   

所以就会出现一些py2exe之类的很不错的工具,用于自动把.py文件编译为.exe文件。   

最近抽空研究了一下手动实现类似py2exe的功能,希望加强对python的了解。   

结果还相当不错。把结果记录下来,与大家共享。   

 

原理

 

文中所描述的方法,基于python的以下几个功能   

1. python程序运行时,会在sys.path指定的路径中查找库文件。   

2. python从2.3开始,支持从zip文件中import库(支持.py,.pyc和.pyo,但不支持.pyd)   

3. python提供C API,让c语言的程序,可以很方便的调用python的程序   

 

实际步骤

 

注:假设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 ;
}
复制代码

 

 

 本文转自 不得闲 博客园博客,原文链接: http://www.cnblogs.com/DxSoft/archive/2010/05/14/1735204.html  ,如需转载请自行联系原作者

 

 


相关文章
|
9天前
|
jenkins 持续交付 Docker
docker之自定义制作镜像(python程序)
docker之自定义制作镜像(python程序)
|
8天前
|
Python
Python 编程入门:打造你的第一个程序
【9月更文挑战第27天】编程,就像是在数字世界里绘画。想象一下,你手中的键盘是画笔,屏幕是画布,而代码则是你的颜料。这篇文章将带你走进编程的世界,学习如何使用 Python 这门语言来创建你的第一个程序。我们将从基础的语法开始,逐步深入到条件判断和循环结构,最终完成一个简单的猜数字游戏。无论你是否有编程经验,这里的内容都将为你打开一扇新的大门。
|
8天前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
1月前
|
存储 Shell 区块链
怎么把Python脚本打包成可执行程序?
该文档介绍了如何将Python脚本及其运行环境打包成EXE可执行文件,以便在不具备Python环境的计算机上运行。首先确保Python脚本能够正常运行,然后通过安装PyInstaller并使用`--onefile`参数将脚本打包成独立的EXE文件。此外,还提供了去除命令行窗口和指定可执行文件图标的详细方法。这些步骤帮助用户轻松地将Python程序分发给最终用户。
怎么把Python脚本打包成可执行程序?
|
26天前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
28 12
|
23天前
|
JSON 监控 数据挖掘
Python I/O管理新篇章:优化你的程序,让数据流动更顺畅
【9月更文挑战第13天】在数据驱动时代,Python因其在数据分析、科学计算及Web开发中的广泛应用而备受青睐。本文探讨了Python I/O管理的关键方面,包括理解I/O瓶颈、使用缓冲技术、并发与异步I/O、高效数据序列化及监控调试。通过具体示例,展示了如何优化文件读写和网络通信,提高程序性能。掌握这些技能,可使数据在程序中流动更加顺畅。
34 3
|
23天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
15 3
|
1月前
|
算法 程序员 Linux
Python编程入门:构建你的第一个程序
【9月更文挑战第4天】编程是现代技术发展的基石,而Python作为一门简洁、易学且功能强大的编程语言,已成为众多初学者的首选。本文将引导你通过一个简单的Python程序,探索编程世界的奥秘,并了解如何利用Python实现基本的算法逻辑。无论你是完全的新手还是希望巩固基础的开发者,这篇文章都将为你提供一个清晰的学习路径。从安装Python环境开始,到编写第一个程序,我们将一步步揭开编程的神秘面纱。
|
2月前
|
小程序 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】 在数字化时代,编程已成为一项宝贵的技能。本文将通过一个简单示例引导初学者步入Python编程的世界。我们将从基础语法开始,逐步构建一个小程序,并在此过程中探索编程的逻辑思维与问题解决策略。无论你是科技爱好者还是职场新人,这篇文章都将为你开启编程之旅提供助力。
|
2月前
|
程序员 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】编程初学者常常在起步时感到迷茫。本文将通过浅显易懂的方式,带领读者从零开始,一步步构建他们的第一个 Python 程序。我们将探索 Python 的安装、基础语法,并通过一个实际的项目——简易计算器,来巩固学习成果。无论你的背景如何,这篇文章都将为你打开编程世界的大门,让你轻松上手,享受编程的乐趣。
下一篇
无影云桌面