吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4982|回复: 13
收起左侧

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

  [复制链接]
Virgo之最 发表于 2020-3-24 17:51
本帖最后由 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

对于这个工具来说, 网上的教程相当多
基本上搜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 = [Executable("guifoo.py", base=base)]) # 打包的模块

然后就可以放心的编写你的 工具脚本
在想打包的时候运行一下

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

免费评分

参与人数 8吾爱币 +6 热心值 +7 收起 理由
xiyoujixuiOhnCV + 1 我很赞同!
Burger.B + 1 谢谢@Thanks!
qtjinx + 1 我很赞同!
ymhld + 1 + 1 我很赞同!
majia1317 + 1 + 1 高手,收藏
凯咪 + 2 + 1 感谢up无私分享
ctOS_ + 1 谢谢@Thanks!
向往诗和远方 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sharokku4869 发表于 2020-3-24 17:57
感谢大佬,我都是直接运行py,没想过打包的事情,感谢大佬分享这个教程,学会了。
qiyuzhilu 发表于 2020-3-24 17:57
erufu 发表于 2020-3-24 18:01
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
感谢大佬!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 17:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表