首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
●两个网站- -| 回首页 | 2005年索引 | - -●高,实在是高

●如何“编译”Python程序

                                      

主要更新记录:

如何编译Python程序(或者如何由Python生成可执行文件)是一个非常常见的问题,总是有人问,列出来,google搜索的时候就可以看到了。如果还有人说"找不到相关资料",唯一的解释就是这个人太懒了,根本没有去找。

如果转载,请注明作者是牡蛎,出自http://blender.blogchina.com/523381.html


   0. Python(及其它高级的脚本语言)不存在把指令编译到本地代码的工具,但是总是可以发布可执行文件。

 

  1. py2exe     http://py2exe.sf.net
    只支持windows平台,应该是大家听到最多的一个名字了,用户不少,所以有问题的话在它的mail list里面很容易找到答案。文档中提到了"无法找到某某code"、使用opengl等模块的问题

     

  2. PyPackage    http://codereactor.net/projects/pypack/index.html
    我觉得py2exe等等工具还是罗嗦得像唐僧,需要在配置文件中写上需要的数据文件。作者完全无视这样一个事实:我需要发布可执行文件的时候,程序已经完工了,所有的数据文件就在主程序所在目录下,所以多数情况下,根本不用到别的地方搜索。现在终于有人站了出来,PyPackage实际上并不是一个程序打包的工具,而只是简化py2exe的操作,甚至可以自动调用InnoSetup 5制作安装文件——不过这个软件并不智能,会打包很多不需要的文件

     

  3. Installer     http://www.mcmillan-inc.com/installer_dnld.html
    可以产生windows、linux平台的可执行文件,现在作者主页连不上去了,但是搜索一下可以在其它地方下载
    自带一个小程序写配置文件,如果程序较复杂,还是需要手工修改这个配置文件。支持从py15以来的所有Python版本
    2005年9月,冰冻牡蛎更新:Giovanni Bajo获得Gordon McMillan's Installer的授权、版权改变为GPL,并在http://pyinstaller.hpcf.upr.edu/继续开发PYinstaller。2006年9月更新:这里可以看到Gordon McMillan's的原始网站的镜像

     

  4. Python自带的freeze.py(不过windows版本不带这个,你可以自己下载Python的源程序再找)。这个是我最不推荐的一种方法(为什么?自己看),不过如果你的Python程序要发布到其它工具不支持的平台上,可以考虑这个方法

     

  5. 新出来的Pyco    http://www.pythonapocrypha.com/projects/pyco/
    还没用过

     

  6. Squeeze    http://starship.python.net/crew/fredrik/ipa/squeeze.htm
    还没用过,只支持Python 1.4

     

  7. cx_Freeze  http://starship.python.net/crew/atuining/cx_Freeze/
    winodws、linux平台。简单的程序甚至都不需要写配置文件

     

  8. Stand alone Python for Windows http://arctrix.com/nas/python/standalone.html
    如果你不介意源程序太过"暴露"的话,用这个吧
    会不会觉得Updated: Sun, 09 Apr 2000 18:39:54 -0600 扎眼?如果你看一看它的VC源代码,就不会这么想了——其实这是普遍适用于win系统的方法,无论是98、2000或者xp。也许也可以用到linux上——我不懂linux,如果真的可以这么做,还请告诉我。

     

  9. py2app    http://undefined.org/python/
    支持linux平台的工具可能也支持mac os,或者直接使用这个py2app。具体就不知道了,只吃过苹果,还没玩过苹果呢

     

  10. Movable Python  http://www.voidspace.org.uk/python/movpy/
    这个其实是使用py2exe制作的、可以放在U盘上的绿色Python。有使用py2app制作苹果版movpy和用cx_Freeze制作Linux版movpy的计划。懒到都不愿意学习py2exepy2app或者cx_Freeze的人可以看看。

     

  11. Shed Skin - A Python-to-C++ Compiler: 试验项目,windows上,连他的例子我都没有编译成功 :(。

     

  12. Psyco: 给Python程序加速的东西,看不出对发布Python程序的直接好处,并且作者以后将致力于PyPy

     

  13. PyPy: 项目目标是纯Python实现的Python、速度比CPython快,将来可以帮助实现编译Python

     

  14. pycPython compiler in Python,一个用纯Python写的Python的bytecode编译器,可以优化输出的pyc文件。和PyPy一样,现在还看不出对发布Python程序的直接好处。只有py24的bytecode。pycpyvm这个新的python虚拟机的一部分。

     

  15. Jungle: 使用GNU工具(as、ld和winres)把Python程序编译到windows的exe可执行文件。该可执行文件只使用基于python24的的pythonic.dll。猜测它支持的模块仅限于内部模块以及jungle.jgl列出的模块。只有可执行文件下载,而这个可执行文件也是用Jungle自己编译的。目前版本号都到1.10了,经常看0.xx的版本号,这个数字好大啊,娃哈哈。

     

另类的方法,对Python语言特性都还不是100%支持,众多的CPython模块也不可以使用,还有,我也没有试过:

  1. for .NET的Python编译器(如Visual PythonIronPython),不过我可不喜欢为了一个芝麻大的软件安装.NET framework
  2. jython,然后用jbuilder、jsmooth、NativeJ之类的包裹一下,或者用gcj编译成本地代码

     

2006年11月26日,近来有些人问,如何保护python开发的商业软件/闭源软件。

我的观点是,纯Python程序,又不想用C语言(其实C语言程序也可以破解,所以最好的方法就是不发布任何程序,嘿嘿),可以试试pyobfuscate混淆源代码,增加可能被反编译获得的源代码的阅读难度。不过pyobfuscate也好久没有更新了,娃哈哈。而实际上,没必要考虑别人会获得源代码的问题。 考虑(尤其是在自己的程序还没有写出来的时候)别人会反编译自己的Python程序,有点杞人忧天。

在*nix下的话,似乎可以(我不用*nix,并不确定)使用Python自带的freeze.py,把源程序的字节码转换成C程序,然后使用GCC编译,这样应该看不到字节码了。在windows下,不知道怎么使用freeze.py,总报错——谁知道的话告诉我吧。但是如果想实现跨平台,使用freeze.py的方法似乎不可取。


首先我相信,目前没有软件可以很好反编译Python 2.4及之后的版本生成的字节码,所以采用新版本Python“编译”到可执行文件,是安全的。

其次,据我所知,目前最成熟的反编译软件只有decompyle。而不是象某些人为了夸大问题的重要性,而口吐莲花所说的“现在有很多Python的反编译软件”。而我不相信有人愿意花钱买这个“唯一的且很多的”反编译软件,理由有二

  1. 看看decompyle页面更新日期,是2004年。我猜测作者把这个软件商业化之后并不成功,并没有太多人需要反编译自己或者他人的Python程序。导致作者没有足够的收入或者兴趣继续完善了
  2. 有人愿意花钱去反编译一个还不存在地软件,或者一个不出名的程序?



次成熟的反编译软件是decompiler.py。但是它比商业软件decompyle差远了。我没有去做试验,是他自己的主页承认说有很多局限的。

最后,真诚请教那些有“很多”Python反编译程序的高手,两个问题:

  1. subsystem.htm
    这是将数独游戏和消除游戏结合起来的益智游戏,未注册的话,只能累积玩60分钟。这是Python+pygame制作的软件,使用py2exe发布,可否麻烦高手——别怕,我不要它的源程序——看看它的注册部分,整个注册机/注册码出来?
  2. wingide
    这个有名的Python商业ide,我不确定它是不是使用py2exe制作的,而且它的规模比较大。我对它的源代码有点兴趣,有人说看不到它的源代码,但是我觉得\bin\2.4\src.zip里面的一堆pyo,是如假包换的源代码的字节码,如果真是如此,麻烦高手在空余时间,反编译一份喽。

【作者: 牡蛎】【访问统计:】【2005年01月9日 星期日 18:12】【注册】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=523381

回复

- 评论人:牡蛎   2007-01-13 10:59:49   

zogtong2003,我不明白你的意思,我不用linux和QT,国内有QT的论坛,也有python社区(www.python.cn),你去那里看看吧

- 评论人:zogtong2003   2007-01-11 15:45:32   

近期很郁闷,想请教一个问题:我做视频播放器mplayer在嵌入式平台的界面,最终选这了emotion皮肤,这个是一个基于qt3和mplayer的皮肤,用python进行编译,qt3和mplayer的交叉编译都已经搞定,就是这个皮肤没有编译到嵌入式arm平台了,现在正式移植这个皮肤,但是感觉很郁闷:遇到很多问题,以前低估了其中的工作量和难度。如下:这个emotion皮肤是是基于qt3的也是qt编写的,但是编译用python,我不知道这样能否实现嵌入式平台的交叉编译,请朋友给出意见,我也可以给出emotion的具体configure和makefile文件,configure很简单,只是确定qt路径和安装路径:


轻给出点宝贵的意见......谢谢!!!! zogtong2003@163.com

- 评论人:小冰   2006-11-20 11:50:02   

里面把中文弄成2个字节的受不了应该是4个字节才对鄙视

- 评论人:andelf   2006-02-19 13:11:29   

内容已转至baidu贴吧~
http://post.baidu.com/f?kz=84566481

- 评论人:冰冻牡蛎   2005-12-31 21:29:27   冰冻牡蛎的博客  

是吗?我比较喜欢installer,不过我只用windows

“我觉得py2exe等等工具还是罗嗦,需要在配置文件中写上需要的数据文件作者完全无视这样一个事实:我需要发布可执行文件的时候,程序已经完工了,所有的数据文件就在主程序所在目录下,所以多数情况下,根本不用到别的地方搜索。”
看到列表里面还是有人问py2exe,谁有空改良下这些软件吧,GUI的、更傻瓜话,在GUI上面选择一个主文件之后,自动“编译”,然后把所有的非py/pyc文件拷贝到结果目录下。

我在修改installer的mcgui.py,修改好了放出来 :)

- 评论人:cry   2005-12-30 17:16:24   

我几乎尝试了所有的工具,最后的选择是:
WINDOW:PY2EXE
LINUX:FREEZE
其它的基本上都有问题。

- 评论人:冰冻牡蛎   2005-11-24 16:20:44   冰冻牡蛎的博客  

我是windows用户,没有用过gcj
jython已经很好的支持python 2.2/2.3的特性了,除了特别的C/C++编写的扩展模块,应该可以支持所有纯python的模块
不过不喜欢java,jre太大了,使用有些java程序的时候,总是报什么编码错误的信息,无法使用。我只是java用户,我不想去学习java的什么东西

- 评论人:ONE_Fox   2005-11-23 12:27:22   

2。用jython,然后用jbuilder、jsmooth、NativeJ之类的包裹一下,或者用gcj编译成本地代码

这个不好。 Java 本身的程序还没有本地化得很好别说在嫁接个 Python

- 评论人:牡蛎   2005-06-09 23:08:15   牡蛎的博客  

:)

- 评论人:BIGBOY   2005-06-04 21:05:46   BIGBOY的博客  

如何“编译”Python程序,文章出处我加上了。

验证码:   
评论内容: