py2exe,Pyinstaller,Cx_freeze,Nuitka都可以完成python打包的任务。

Pyinstaller和Nuitka都号称跨平台,但其实顶多只能算是工具本身跨平台,实际体验中不仅打包产生的文件不能跨平台,能否成功打包本身也不确定。

Nuitka

nuitka的作用是将python程序转换成C语言的可执行elf文件。这样在运行时就可以享受到C语言处理过程中的优化,提高速度。经测试,Nuitka打包后的exe比Pyinstaller打包后的exe运行速度提升30%,PyQT5的UI文件转换成py文件转换成C语言后,界面秒开呀。

安装:

sudo apt-get install nuitka

使用:

假设有python文件 main.py 其中import了 a.py, b.py, c.py

转换为可执行文件只需运行:

nuitka --recurse-all main.py

运行后会生成main.exe文件,注意main.py中import的文件会被自动包含。

输入下面代码即可执行

./main.exe

但是有网友反馈了一些他的坑:

问题:

1.跨平台性很差

这点,上面的"python打包工具对比"中也谈到了。

具体在我使用时,在ubuntu中打包了一份python文件,拿到windows下运行,提示

该版本的main.exe 与您运行的 Windows 版本不兼容。请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序,然后联系软件发布者。

在centos中运行,提示有python依赖库找不到。

2.使用 --standalone参数后无法生成.exe文件

官网介绍说使用该参数可以解决代码对python是否安装的依赖

The created binaries can be made executable independent of the Python installation, with --standalone option.

可是我用这个参数后就无法生成可执行文件了。

Pyinstaller

安装:

1、安装pywin32

  • 下载安装文件:查找到跟自己适用的python版本及window系统版本匹配的pywin32,下载后安装
  • 使用pip命令安装:pip install pywin32

2、安装Pyinstaller

  • 下载安装文件安装:官网
  • 使用pip命令安装:pip install PyInstaller

运行:

pyinstaller main.py

即可得到可执行文件,虽然也存在本机编译后的文件不能在服务器执行的问题:



gclt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /root/gclt/libz.so.1)



但是在服务器上编译的代码是可以在本机成功执行,当然了,所谓的跨平台,其实是个伪命题,Linux下编译产生的可执行文件并不能在Windows和Mac OS下执行,前者会产生类似下面的错误(使用Nuitka时也是这样)

Too big to fit in memory

而在Mac OS下则会直接提示找不到相关可执行文件。

最后,分别在Linux,Windows,Mac OS下分别使用Pyinstaller完成任务

开发完python程序后使用pyinstaller 打包成exe程序后出现错误:
通常的打包命令:
pyinstaller.exe --hidden-import=queue -w -F $FileName$




python 常用打包工具 python打包工具比较_c语言反编译工具


运行出错
为了定位问题的出现需要修改上述打包命令为:

pyinstaller.exe --hidden-import=queue -F $FileName$

有时候将.py文件打包成.exe文件后,不一定能够正常运行。但是点.exe后程序一闪而退,就不知道问题出在哪里?

  1. 在运行程序后快速进行屏幕抓取:(可能需要抓多次)


python 常用打包工具 python打包工具比较_c++打包exe_02


错误信息
从上图中,可以看出由于文件找不到导致程序出错。

从这里也可以大致了解下pyinstaller成可执行程序的流程是:
会将exe解压到系统某处(图中为AppData/Local/Temp下),然后解释执行。2. 也可以在cmd命令行 或者 Windows PowerShell里面运行.exe文件


python 常用打包工具 python打包工具比较_c语言反编译工具_03


解决 FileNotFoundError 问题


python 常用打包工具 python打包工具比较_c++打包exe_04


然后使用如下命令打包:

pyinstaller.exe --onefile --additional-hooks-dir=. --hidden-import=queue -w -F robotManagerTools.py


python 常用打包工具 python打包工具比较_python 常用打包工具_05


[参考]
https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-fileshttps://pyinstaller.readthedocs.io/en/stable/usage.htmlhttps://pythonhosted.org/PyInstaller/hooks.html总结:更多的网友还是推荐pyinstaller,但是在知乎见过一个网友分享的文章关于Nuitka大家可以参考:

https://zhuanlan.zhihu.com/p/133303836