免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11356 | 回复: 2

静态编译python,Nuitka, That is the point [复制链接]

论坛徽章:
0
发表于 2014-08-19 18:59 |显示全部楼层
本帖最后由 cdhigh 于 2014-08-19 19:26 编辑

我在前一篇文章
http://bbs.chinaunix.net/thread-4149295-1-1.html
中写到使用cython加速你的程序,保护你的源代码,尽管cython是目前来说使用“python”效率比较高的方式,但是毕竟cython也算另一种语言了,还需要学习其语法,并且其代码文件和python不兼容,所以一般仅用于核心效率瓶颈代码。

在此帖子,我在介绍一种简单的“加速”方式,当然,此方式更合适的说法是一种发布程序方式,隐藏源代码方式。

=====================================
Nuitka,100%兼容标准python2/python3,静态编译你的python程序


1. 概述
Nuitka(nuitka.net)可以将python代码转换为C++,然后编译为可执行文件,其通过直接调用python的api的方式实现从解析语言到编译语言的转换,并且在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容,作者宣称100%通过了python的测试用例,作者也宣称可以加速python代码0%~258%。
对比于cx_freeze/py2exe等打包工具,Nuitka则是完全的编译工具,编译后的可执行文件已经不需要字节码解释了,从这点看,已经很像VB6程序依赖于msvbvm60.dll一样了,都是调用dll内的api实现各种功能。
并且nuitka相比cython更帅气的一点是:享受编译福利的同时,你不需要和动态行为说再见。

2. 安装
首先到官网上根据你的python版本下载对应的nuitka安装包,直接执行安装即可,如果安装完成后系统环境变量中没有nuitka安装目录,建议添加。
其次要实现编译,得需要一个编译环境,在windows环境下可以安装微软的VS套件(至少是VS2012,VC6是编译不过的),或者按照MinGW(推荐,小巧,编译速度比VS快)。
安装完编译环境后,要将其bin目录添加到系统的环境变量,以便nuitka调用。

3.编译
直接调用
  1. nuitka --exe yourmodule.py
复制代码
则编译生成yourmodule.exe,试一下直接执行吧。
如果要完全脱离python环境,可以使用命令行
  1. nuitka --exe --recurse-all --standalone --mingw --icon=app_icon.ico yourmodule.py
复制代码
则会将所有依赖的包全部编译然后链接成一个单一的exe文件(依赖的pyd和dll无法链接,会拷贝到目标文件夹)
编译过程很慢,要有耐心!而且目标文件会比较大,要有心理准备。
一般情况下Nuitka生成的exe会比cx_freeze等打包后的exe要大不少,不过现在的计算机不用在乎这一点大小了吧。

4.nuitka的一些问题
尽管nuitka已经很稳定了,但是软件都是有bug的,我这里就列出几个我遇到的

1.python3+pyqt无法脱离python使用
此问题是nuitka不够智能,没有将pyqt所有的依赖都拷贝到目标文件夹所致,所以你要手工拷贝如下文件或目录:
sip.pyd,libEGL.dll,plugins\imageformats\,plugins\platforms\

2.dll/pyd过多
nuitka会将所有依赖的dll都拷贝到目标文件夹,而不管是否是系统标准dll,这样导致目标文件夹很多dll文件,所以编译完成后你可以手动删除这些dll,可能还有一些pyd文件是程序不需要的,也可以删除。

3.无法方便获取当前运行目录
打包工具都会将sys.executable设置为当前执行文件,但是nuitka为了100%和python兼容,没有设置此值,而__file__没有目录信息,所以需要调用操作系统api来获取了,我这里封装了一个简单的函数:
  1. def getModuleFilePath():
  2.     #在使用nuitka编译后获取当前运行目录,当前仅工作于windows
  3.     import ctypes
  4.     try:
  5.         GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameA
  6.     except:
  7.         return os.path.dirname(os.path.realpath(__file__))
  8.     szPath = ctypes.create_string_buffer(b'\x00'*2048)
  9.     GetModuleFileName.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
  10.     GetModuleFileName(0, szPath, 2048)
  11.     return os.path.dirname(str(szPath.value))
复制代码
5.结论
我也是经过了一段时间的观望和测试才决定使用nuitka的。
评测结果:通过所有测试用例,可执行文件很大(十多兆),内存占用和打包工具打包后的exe基本一样,效率提升一点点,没有源代码泄漏的担心。
从一段时间的实际使用和测试来看,完全可以部署于生产环境。

当然如果你对文件大小比较敏感并且不在意源代码泄漏的话(pyc很容易被反编译),建议使用打包工具代替。

论坛徽章:
0
发表于 2015-03-15 12:58 |显示全部楼层
你好,为什么使用nuitka编译wxpython时会出现以下错误,编译失败:
cc1plus.exe: out of memory allocating 380788 bytes
scons: *** [sample.build\module.wx._core.o] Error 1

尝试过wx2.8,2.9,3.0都没用。环境是win7,python27,nuitka 0.5.10.2。

控制台错误信息:
cc1plus.exe: out of memory allocating 380788 bytes
scons: *** [sample.build\module.wx._core.o] Error 1
scons: building terminated because of errors.

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-11-21 11:14 |显示全部楼层
经过了一段时间的测试
才发现
nuitka基本一样,效率提升不大
就是一点点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP