其他 pyinstaller 打包技巧见《Python程序打包指南》
PyInstaller是一个能将 Python 程序转换成单个可执行文件的程序,可以将 Python 应用程序及其所有依赖项打包到一个包中。用户可以在不安装 Python 解释器或任何模块的情况下运行打包的应用程序。PyInstaller 支持 Python 3.7 和更高版本,并正确地捆绑了许多主要的 Python 包,如
numpy
、matplotlib
、PyQt
、wxPython
等。操作系统支持Windows
、Linux
、Mac OS X
,详情见官网,github,文档本文使用的环境为:Win11 X64 、Python 3.8.x 、Pyinstaller 4.9
本文主要介绍三部分内容:1. pyinstaller的安装及配置,以及安装过程中出现的一些问题;2.pyinstaller其他常用的参数;3. Pyinstaller 打包程序的反编译及加密
一、Pyinstaller 的安装及安装错误处理
Pyinstaller 可以通过 python 自带的包管理器 pip
直接安装
1.1、安装命令
pip install pyinstaller
验证安装是否成功,输入pyinstaller -v
命令,提示版本号即安装成功,如下⬇️:
1.2、安装错误处理
-
若提示 “
Pyinstaller 不是内部或外部命令
” 这类错误,则是由于python环境变量没有将pip
安装的这些包的位置添加到系统环境变量,解决方法如下⬇️:首先查找一下环境pip将包安装在了什么地方,然后将这个地址添加到系统变量中,再次运行上述命令就可以成功,具体步骤如下⬇️
安装完 pyinstaller 后,执行
pip show pyinstaller
,会显示出该包的安装位置,我们将该地址下的 Scripts文件夹 添加到环境变量中,(我的是 D:\Pyvenv\csdn\Scripts)重启命令行窗口,再次运行以上命令就会正常:可以看到 Scripts 文件夹下有我们的 pyinstaller.exe 其实我们执行命令时调用的也是它。
-
💢还有一个容易出现的问题就是:如果手动切换过pip安装包和缓存文件夹的位置,尤其是通过修改
pip.ini
切换的,会偶发性的出现设置环境变量后依旧无效的现象,这种要不就取消设置,或者重装 python。
二、其他常用参数介绍
参数 | 作用 |
---|---|
-h | 查看该模块的帮助信息 |
-F | 产生单个的可执行文件,就是单文件exe |
-D | 产生一个目录(包含多个文件)作为可执行程序,就是打包成一个文件夹,exe在其中 |
-w | 指定程序运行时不显示命令行窗口(仅对 Windows 有效),就是隐藏cmd命令行黑框 |
-o | [dir]指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
–upx-dir | 使用upx对文件进行压缩,减小生成的exe文件的体积 |
–clean | 在构建之前,清理PyInstaller缓存并删除临时文件 |
-a | 不包含 Unicode 字符集支持 |
-d | 产生 debug 版本的可执行文件 |
-c | 指定使用命令行窗口运行程序(仅对 Windows 有效) |
-p | [dir]设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。 |
-n | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
这些参数我们一般只用到-F
、-D
、-w
、-o
、--upx-dir
、--clean
这些,其他的参数都不常用。
三、打包程序的反编译及加密
查阅了一些相关资料后,发现解包还原代码也很简单😱
3.1、反编译
提取源代码⬇️:
先下载 pyinstxtractor 包,提取生成的exe
中的pyz
(一般是pyc
)文件
# 安装:直接执行下载的 py 文件即可
# 解包 xx.exe
python pyinstxtractor.py xx.exe
执行命令后会生成xx.exe_extracted
文件夹,xxx.exe.manifest
文件等。再找到一个没有后缀名的文件,就是打包的.py
文件对应的pyc
😏
还原代码⬇️:
然后再通过 python-uncompyle6 工具,将pyc
文件反编成.py
文件
# 安装
pip install uncompyle6
# 反编译 xxx.pyc 文件,输出为 xxx.py 源码文件
uncompyle6 -o xxx.py xxx.pyc
反编译这块我不太懂,网上有很多可以参考的教程,大家可以搜索一下,基本逻辑就是这样😀参考教程
3.2、加密
虽然被如此轻松的解密手段😰到了,但是 Pyinstaller 也是支持加密打包的,使用 --key + 密码
参数即可,例如:
pyinstaller --key 666777 xxx.py
😅不过这个加密也不是很强,对保密性有很强要求的建议使用把需要加密的模块通过C或者C++编写,通过python调用,再打包。