20 Nov 2009

PyInstaller, better than py2exe - ZT

Python是一个强大的工具,可惜不是每个人的电脑裡面都有安装。当您写了一个好用的工具。要如何让那些没有安装Python的人使用你的工具 呢?对于这样一个需要standalone exectuable环境的需求,直到撰写本文为止,我只看到两个比较好用且有持续维护的套件。一个是py2exe。另外一个就是本文要介绍的 PyInstaller。

py2exe与PyInstaller的主要差异在于,py2exe只支援Win32平台。PyInstaller除了Win32平台外,也支援Linux及其他的Unix平台。这也是为何在介绍过py2exe后,我还想要介绍PyInstaller给大家。

先让我们看一下PyInstaller的特性:

* 可将Python程式转换成单独的执行档。执行的电脑上就不用安装整套的Python了。
* 跨平台。目前可以在Windows, Linux及Irix下面执行并製作执行档。
* 支援多种版本的Python。可以从Python 1.5支援到目前的2.4。或甚至更新的版本。
* 双重包装模式:
o 单一路径模式。可将所有相关的Python所需要的dll或是执行码置于同一个目录中。
o 单一执行档模式。将所有的东西变成一个很大的单一执行档。

* 支援UPX的执行档压缩。
* 可选择的终端机文字输出。可用来查看stdout及stderr的讯息。
* 可更换的执行图示(仅于Windows上支援)。
* 完整的版本资讯设定(仅于Windows上支援)。
* 支援COM server的建立(仅于Windows上支援)。

PyInstaller与另外一套py2exe最大的差别就是它还多了对Linux的支援。这对于Linux的使用者来说真是个天大的好消息。

PyInstaller 本身并不是一个Python module。所以安装PyInstaller时,只要找一个路径将它解开后放入即可。不过,这样并不算安装完成。下一步,您要让PyInstaller 认识一下您系统上面的Python。如此一来,它才知道如何为您包装您写的Python Script。下面的步骤只有非Windows的使用者需要。Windows的使用者,因为Python本来就已经被编译成pythonXX.dll了。所以PyInstaller将会直接取用这些dll。

进入您的PyInstaller的安装目录后,找一个叫做Make.py的档桉。执行它!

正常的状况下,会产生下面两个档桉:
* support/loader/run
    * support/loader/run_d

如果您系统上有好几个版本的Python。则执行Make.py的那个版本将会作为日后建立执行档的依据。

接着执行在PyInstaller目录中的Configure.py程式。它会将一些资讯储存于config.dat中,以便日后使用。至此,您的PyInstaller可以说是安装完毕了。接着就是要建立你的程式了。

首先,您的Python script应该已经通过某种程度的测试,并且准备要release给您的使用者。为了方便解说,我们假设您的script共有三个且放在同一个目录下:
* main.py
    * amodule.py
    * bmodule.py

当然,您的script内会import很多Python的模组,有些是Python预设的,也有些可能是您自行上网下载回来安装的。这都没有问题,只要您的程式确定可以正确的使用他们即可。

接着在您的目录下执行下面的指令。
> python <PyInstaller Dir>/Makespec.py main.py

如果成功,您将看到在目录下面多了一个xxxx.spec档桉。他的档名通常是您的script档名称,但是副档名会换成.spec。这个档桉会被后面的步骤所使用。

Makespec.py有一些特别的参数可以使用,例如:想要做出单一的执行档,可用下面的方式:
> python <PyInstaller Dir>/Makespec.py --onefile main.py

我们将比较常用的参数列出:
--onefile           製作出独立的执行档

--onedir            製作出的档桉街放在同一个目录下(预设值)

--tk                製作包含TCL/TK的档桉。

--windowed          製作视窗程式。(程式执行时不会有文字视窗出现)

--console           製作一般的console程式。

--upx               製作透过UPX压缩过的执行档。

--icon=<FILE.ICO>   指定程式的图示。

--version=<FILE>    指定程式的版本资讯(需要准备一个档桉放这些资讯)。

--name=<NAME>       指定程式的名称。若无此选项,则主script档桉的名称将被使用。

通常,完成后上面的步骤就不需要反覆执行。就算您又再度修改了source code,也只需要执行后面的动作就可以了。除非您重新变动了整个Python相关的环境。才需要再度执行前面的指令。

接下来的动作很简单,您只要在程式的目录下面执行下面的指令就可以了。
> python <PyInstaller Dir>/Build.py <spec file>

其中,spec file就是前面Makespec.py所製作出来的spec file。以前面的例子来说,这个命令将会是:
> python <PyInstaller Dir>/Build.py main.spec

成功的话,您应该会在这个目录下面看到一个名为dist的目录。其中就是您的程式名称。就前面的范例而言,就是distmain这个目录。

在这个目录裡面的就是您要给使用者使用的档桉。如果您前面有开启--onefile的选项。这个目录下面将只会剩下一个可执行档。所以,通常我都是将这个目录下的东西整个用ZIP或是RAR等压缩工具压起来,再找个地方让使用者来抓取就可以了。

这篇简介或许不长,但是绝大部分的程式可能单靠这篇简介就够用了。这也代表着PyInstsaller有多简单易用了。也许日后有人会有时间帮它写个GUI的front-end,那就会更简单了。

No comments :

Post a Comment