py2exe 是一个 python 下面的拓展,作用是将 python 语言编译成为 windows 上可以直接执行的
exe 文件。类似的还有PyInstaller,有人说PyInstaller比py2exe还要好用,具体我没对比过,这里只讨论
py2exe。
1)为什么使用 py2exe
python
程序相当于一种脚本语言,它的优势是编写方便执行方便,写完即可运行,不用编译。这既是它的优点也是它的缺点。因为在分发的时候使用者必须和编写者拥有完全相同的编译和执行环境才能保证程序正常运行。
比如前段时间为了赶进度,我给实验室同事用 python
写了一个数据处理和可视化程序,在我电脑上运行完全没有问题。但是他是一个 python 盲,于是程序给他后他还得在电脑上安装
python 程序以及其他一系列相关的库,折腾了半天他才用上,这使我产生了深深的愧疚感。
如果将 .py 文件打包成为 .exe
文件最大的好处就是所有的库文件都被整合起来,用户只需要拿到exe文件就可以运行程序,省去了找一系列库文件的麻烦,毕竟“一键点击 exe
运行程序”程序的观念现在已经根深蒂固了。至于代码加密这种功能倒是其次,因为python本身也提供将 py
文件转化为二进制文件的方法。
2)使用方法
py2exe 的使用方法及其简单,拢共分三个步骤:
a. 下载 py2exe 模块;
b. 为 py 文件编写 setup 文件;
c. 执行 setup 文件进行编译。
经过以上三个步骤即可将 .py 文件转化为依赖于 python 就可以运行的 .exe 文件。通过适当的设置, py2exe
还能够将所需要的文件打包起来,并给文件加icon等功能。同时,py2exe 还对许多第三方 python
模块提供支持,可以将许多第三方 python 模块也打包进来。matlab 和 python
都拥有很强的数据处理和可视化功能。个人觉得 matlab 在易用性和速度方面完爆
python,但是 python 在代码分发这一块确实比 matlab 自带的 complier
工具箱要强很多(而且不要钱=___=)。
3)简单例子
先来个简单教程,这个从官网直接扒下来的。写一个 python 的输出 “Hello Word!”的脚本,将其转化成为 exe
文件。
Hello.py 代码:
print "Hello, World!"
这个文件就不测试了,直接开始写 setup 文件。 setup 文件将 py 文件转化成为 exe
文件,并设置所需要的参数。
setup.py代码:
from distutils.core
import setup
import py2exe
setup(console = ['Hello.py'])
console= 后面跟着的就是要编译的 py 文件的文件名。
接着打开cmd,cd 到当前文件夹,输入:
python setup.py py2exe
如果没有错误的话,会出现一系列提示,然后在当前文件夹生成两个子文件夹,其中所有的文件都包含在 dist
文件夹中。dist文件夹可以随意拷贝分发。打开dist文件夹,可以发现许多相关文件,其中 Hello.exe
就是所需要的程序,双击或者在 cmd 中运行,就可以看到程序运行的结果。
4)进一步
下面我们进一步来尝试编译上次写的调用 .dll 文件的 python 程序(UseCDll.py)。
首先我们直接上面那个setup文件,把最后一行改成
setup(console = ['UseCDll.py'])
运行 setup.py ,成功编译。进入dist文件夹,运行 UseCDll.exe 却出错了。
如果这个时候审视dist文件夹,就可以发现 TestDll.dll 文件并没有被拷贝到 dist 文件夹中,由于
UseCDll.py 调用了 TestDll.dll 中的一些函数,因此导致运行出错。这时候我们需要做的就是往 setup.py
文件中增加一些参数设置,将 TestDll.dll 文件一并打包到 dist 文件夹中。
修改后的 setup.py 内容:
from distutils.core
import setup
import py2exe
options ={'py2exe' : {'dll_excludes':
['w9xpopen.exe'], #w9xpopen is the file for windows9x platform, we can
exclude it.
}
} setup( options
= options,
console
= ['UseCDll.py'],
data_files
= [
('',['TestDll.dll'])
#inclue TestDll.dll to dist
folder
]
)
我还去掉了个别文件,具体可以再注释中读到。
编译后可以发现 TestDll.dll 文件已经被打包到了 dist 文件夹中,运行结果:
D:\TempFIle\DllTest\dist>UseCDll
c_long(5)
5
10
Hello from DLL
10
大功告成。