PyInstaller打包python程序为exe可执行文件

2023-11-26 09:40:42 浏览数 (1)

教程千千万,貌似我的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

其实如果你自己会写.spec,可以直接通过pyinstaller xx.spec来执行打包

代码语言:javascript复制
# -*- 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 虽然被如此轻松的解密手段

0 人点赞