教程千千万,貌似我的window电脑就是打包不了,而且不同电脑的表现都不一致,很是奇怪。
1 极简版
代码语言:javascript复制pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源
然后
代码语言:javascript复制Pyinstaller -F py_word.py 打包exe
Pyinstaller -F -w py_word.py 不带控制台的打包
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe图标打包
这里的参数设定:
来看看生成的文件都是什么:
- 同名的
.spec
:重要配置文件,.spec文件
中主要包含4部分:Analysis、PYZ、EXE、COLLECT:- Analysis:主要是分析py文件的依赖信息
- PYZ:是一个.pyz的压缩包,包含程序运行需要的依赖
- EXE:是根据上述两项内容而生成的
- COLLECT:主要是输出信息
- dist文件夹:最终的exe文件存放位置,可能要从dist拿出来
- build文件夹:中间过程,创建好之后可以直接删除
1.1 生成文件spec
详解
参考: https://blog.csdn.net/kevinshift/article/details/104880101
代码语言:javascript复制其实如果你自己会写
.spec
,可以直接通过pyinstaller xx.spec
来执行打包
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(['gui.py'],
pathex=['D:\gui'],
binaries=[],
datas=[('D:\gui\config.ini','.'),('D:\gui\清洗规则.xlsx','.')],
hiddenimports=['pandas'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
datas里边的元素是以元组的形式来存储的,有这么一个映射关系:
代码语言:javascript复制datas = [('源文件路径','目标路径')]
如果有多个,就多放几个元素,内容不限,如果目标路径是打包后的根目录,那就写. 修改好之后,运行这条命令即可:
代码语言:javascript复制pyinstaller xx.spec
其中datas和binaries注意,这是一个键值对,可以枚举一个或多个。 其中,前边的表示拷贝的文件,第二个表示拷贝的路径。
代码语言:javascript复制#注意,必须有'.'。否则报错:ValueError: too many values to unpack (expected 2)
#下面这个表示将文件libgeneral.pyc拷贝到当前文件夹下,就是解压的__MIE...等
binaries=[(r'libgeneral.pyc','.')],
#下面表示将libgeneral.xml拷贝到.data文件夹下
datas=[(r'libgeneral.xml',r'.data')],
#还可以整个文件夹的拷贝,或者一类文件的拷贝。如下设置了多个规则的
datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) , #/mygame/sfx/文件夹下所有mp3
( '/mygame/data', 'data' ), #/mygame/data文件夹下所有文件
( 'src/README.txt', '.' ),
],
上面说了有时候我们需要另外添加资源文件,可以通过编辑spec文件,也可以通过命令行参数。
例如使用opencv的时候存在找不到视频编解码器的情况(Pyinstaller详细教程) 即找不到opencv_ffmpeg341_64.dll 这时候需要我们手动设置资源路径,
可以通过–add-binary参数设置,也可以在spec文件添加binaries参数,这个参数是个list,每个元素是个二元组
代码语言:javascript复制binaries=[('D:\ProgramSourceCode\PycharmProjects\video_proc\venv\Lib\site-packages\cv2\opencv_ffmpeg341_64.dll', './cv2')]
前一个代表原始资源路径,后一个代表拷贝到可执行文件夹的文件路径。
1.2 是否变成一个exe主文件
来自:https://blog.csdn.net/kevinshift/article/details/104880101
代码语言:javascript复制# 打包成一个exe文件
Pyinstaller -F py_word.py 打包exe
# 打包成一个文件夹
Pyinstaller py_word.py 打包exe
pyinstaller打包文件包含两种情况: (1)将py文件、python及第三方库全部打包为一个单独的Exe中。
(2)将以上三者打包形成一个文件夹,文件夹中包含一个Exe,一个python,及其依赖的第三方库。 二者通过不同的选项 二者的优劣对比: (a)启动时间 单一可执行文件比文件夹的启动时间要长 因为当程序运行时,单一的可执行文件需要解压程序的第三方依赖文件到临时文件夹中。 (b)文件结构 单一可执行文件的文件结构和工程目录是一样的,但是生成文件夹就不一样了,若程序中包含相对路径,这个相对路径自然基于的是文件夹目录,这点需要注意。 在打包过程出现问题时,可以生成文件结构,进入细致查看发生了什么。
2 虚拟环境打包
按照极简版,其可能会将你所有依赖打包,就会让文件变得非常大。 可以使用conda的虚拟环境
代码语言:javascript复制#创建虚拟环境
conda create -n aotu python=3.6
#激活虚拟环境
conda activate aotu
# 安装必要的依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
#Pyinstaller打包
Pyinstaller -F -w -i apple.ico py_word.py
安装完之后,可以在自己的虚拟镜像里面python x.py
试一下是否可以正常执行,就可以开始Pyinstaller
打包
3 其他打包需求
3.1 加密打包
加密打包
来自: https://zhuanlan.zhihu.com/p/470301078
虽然被如此轻松的解密手段