Virgo之最 发表于 2020-3-24 17:51

【Python之点到为止】如何优雅的将你的代码打包成EXE

本帖最后由 Virgo之最 于 2020-3-25 20:33 编辑

此.py非彼PY
# 打包发布
本文旨在Windows环境下打包发布.
部分模块支持跨平台打包, 可以参考对应文档.

仅介绍我在使用Python中经常用到的三款工具
像PyInstaller、py2exe、py2app (mac)原理都差不多
cx_Freeze虽然与上面三个也类似, 但是知道的人不多
而今天的重点就是**Nuitka**

---
还有, 既然已经要考虑打包了
那么基础部分安装模块这类就不细说了

---
## PyInstaller
```
pip install PyInstaller
```
- 方便
- 简单

对于PyInstaller给我的感觉就是这两个优点
不用多考虑一个命令就将所有能用到的东西都打包了
```
pyinstaller -F demo.py
```
关于参数:
```
-F : 单文件打包, 这种其实是不推荐的. 原理就是个自解压
-D : 这个是默认选项, 会将依赖放到指定目录中
-i : 给生成的exe换个图标
```
更多的参数, 比如说你想指定那些模块打包哪些不打包
以及在Windows下面用不用UAC, 就是管理员运行
用不用UPX等等, 都只是一个参数的问题
剩下的就都交给他帮你搞定.

参数文档:[ https://pyinstaller.readthedocs.io/en/stable/usage.html]( https://pyinstaller.readthedocs.io/en/stable/usage.html)

对于这个工具来说, 网上的教程相当多
基本上搜python打包全是它
所以这里不赘述, 文档就算没有中文 浏览器翻译也能看懂

## cx_Freeze
```
pip install cx-Freeze
```
这款工具来说对标PyInstaller
最大的特点就是可以编写一个打包脚本
需要打包的时候只需要python执行一下
比如说编写一个 setup.py
```
import sys
from cx_Freeze import setup, Executable

# 虽说ex_Freeze可以自动检测你使用了那些模块, 但是有些情况你可能需要微调一下
# 比如A模块调用了B模块B模块又调用了C模块.ABC都是第三方模块, 很可能BC就没办法打包
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}

# base就是设置是否是控制台程序, 如果你用pyqt这种GUI库编写的就可以隐藏控制台.
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(name = "guifoo", # 程序名
      version = "0.1", # 版本号
      description = "My GUI application!", # 程序介绍
      options = {"build_exe": build_exe_options}, # 打包参数
      executables = ) # 打包的模块
```
然后就可以放心的编写你的 工具脚本
在想打包的时候运行一下
```
python setup.py build
```
是不是很方便, 但是cx_Freeze无法打包为单文件程序
但是可以打包成安装程序, 就是安装包

官方文档: (https://cx-freeze.readthedocs.io/en/latest/distutils.html)

官方也提供了非常多的例子: (https://github.com/anthony-tuininga/cx_Freeze/tree/master/cx_Freeze/samples)
几乎都是开箱即用.


## Nuitka

本文的重点来了.
介绍的前两款工具都是, 将py文件 编译成 pyc(python字节码)
其中pyinstaller可以加密这些字节码
但是pyc文件很容易反编译成.py脚本文件
然后将运行环境压缩在一起.
Nuitka就不一样了.

官方说明(机翻):
> Nuitka 是用 Python 编写的 Python 编译器。
>
> 它与 Python 2.6、2.7、3.3、3.4、3.5、3.6 和 3.7 完全兼容。
>
> 你喂它你的Python应用程序,它做很多聪明的事情,并吐出一个可执行或扩展模块。


简单来说Nuitka可以直接将你的程序编译成exe.
先把py转成c, 然后c再编译.
这样在想看见源码几乎不可能了.
虽然可以反汇编, 但已经让一些新手拒之门外了.
### 安装
```
pip install Nuitka
```
### 配置环境
需要安装编译器:
         - MSVC, 微软的VC编译器
         - MinGW, 可以再GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库.

这两款编译器任选其一就行
实测下来MSVC打包后会带有一些额外的DLL
所以我最终选择的是MinGW.
MSVC就需要安装 Visual Studio 2017版本以上
MinGW需要安装5.1以上, 或者使用特殊参数支持4.4
MinGW在线安装: (https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe)
这东西安装配置环境就不多说了.挺无脑的
但是在线安装国内应该很慢, 自己想想办法= =

### 编译打包
```
python -m nuitka --standalone some.py
```
如果环境都配置正确那么 执行完毕
目录下就会有一个 some.dist, 里面有一个some.exe
还有其他的一些dll 和 pyd文件.
> PYD文件就是dll文件, 只不过经过特殊处理可以在python中直接调用

文件夹里面其实有很多没用的包, 可以选择性删除.
因为上述命令执行时间可能很长
不要以为它卡了, 你可以增加两个参数 --show-progress --show-scons
```
python -m nuitka --standalone --show-progress --show-scons some.py
```
让他显示一下进度
它还可以打包模块、还可以打包整个包
更多的等待你发现
官方文档: (https://www.nuitka.net/doc/user-manual.html)

---
## 总结
选择自己合适的打包方式
不要为了追求原生exe或者文件大小而去使用Nuitka

想要减少打包后的大小还是有很多方法的
比如说使用官网提供的嵌入式环境
减少使用第三方包等等
像编译这种打包方式还是挺折腾的
然而你要真的决定在项目中使用他了
那就需要按照文档取考虑做优化了.
毕竟py转到C, 目前还不能说太完美的.

那么我就点到为止了.
PS: 带你入门, 自己发掘. 这不就是编程的快乐么?

---
哦还有, 虽然叫点到为止
但是你们使用中遇到的问题可以在下方评论
会尽力帮你解决. By: **Virace**

sharokku4869 发表于 2020-3-24 17:57

感谢大佬,我都是直接运行py,没想过打包的事情,感谢大佬分享这个教程,学会了。

qiyuzhilu 发表于 2020-3-24 17:57


感谢分享

erufu 发表于 2020-3-24 18:01

才知道还能py -> c -> 编译 这么操作……

wsleocn 发表于 2020-3-24 18:04

感谢分享!

向往诗和远方 发表于 2020-3-24 18:07

还没有试过打包,学习下?

ctOS_ 发表于 2020-3-24 18:27



    Nuitka 是用 Python 编写的 Python 编译器。

    它与 Python 2.6、2.7、3.3、3.4、3.5、3.6 和 3.7 完全兼容。

    你喂它你的Python应用程序,它做很多聪明的事情,并吐出一个可执行或扩展模块。



我昨天还因为pyhook不支持3.8头疼了一下下

Virgo之最 发表于 2020-3-24 18:39

ctOS_ 发表于 2020-3-24 18:27
我昨天还因为pyhook不支持3.8头疼了一下下

3.8再性能上来说 没有 3.6 3.7那么明显.

如果没有特殊要求最新3.6 3.7也是可以的

但是官方只是称与这些版本完全兼容, 并没说不兼容3.8

我目前写的一下程序都是再3.8环境下打包的.
没遇到什么问题.

看,六眼飞鱼 发表于 2020-3-24 19:09

感谢大佬的教程,学习到了

linghui 发表于 2020-3-24 20:24

感谢大佬!
页: [1] 2
查看完整版本: 【Python之点到为止】如何优雅的将你的代码打包成EXE