当前位置:   article > 正文

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

pyinstaller to exe

教程千千万,貌似我的window电脑就是打包不了,而且不同电脑的表现都不一致,很是奇怪。



官方地址:
https://github.com/pyinstaller/pyinstaller
官方文档:https://pyinstaller.org/en/stable/

python版本要求: Python version 3.8-3.12.

1 极简版


pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源
  • 1
  • 2

然后


Pyinstaller -F py_word.py 打包exe
Pyinstaller -F -w py_word.py 不带控制台的打包
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe图标打包
  • 1
  • 2
  • 3
  • 4

这里的参数设定:
在这里插入图片描述

来看看生成的文件都是什么:

  • 同名的.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来执行打包

# -*- 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

datas里边的元素是以元组的形式来存储的,有这么一个映射关系

datas = [('源文件路径','目标路径')]
  • 1

如果有多个,就多放几个元素,内容不限,如果目标路径是打包后的根目录,那就写.
修改好之后,运行这条命令即可:

pyinstaller  xx.spec
  • 1

其中datas和binaries注意,这是一个键值对,可以枚举一个或多个。
其中,前边的表示拷贝的文件,第二个表示拷贝的路径。

#注意,必须有'.'。否则报错:ValueError: too many values to unpack (expected 2)
#下面这个表示将文件\lib\general.pyc拷贝到当前文件夹下,就是解压的__MIE...等
binaries=[(r'\lib\general.pyc','.')],	

#下面表示将\lib\general.xml拷贝到.\data文件夹下
datas=[(r'\lib\general.xml',r'.\data')],

#还可以整个文件夹的拷贝,或者一类文件的拷贝。如下设置了多个规则的
datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ,	#/mygame/sfx/文件夹下所有mp3
		( '/mygame/data', 'data' ),			#/mygame/data文件夹下所有文件
		( 'src/README.txt', '.' ),
		],
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上面说了有时候我们需要另外添加资源文件,可以通过编辑spec文件,也可以通过命令行参数。

例如使用opencv的时候存在找不到视频编解码器的情况(Pyinstaller详细教程)
即找不到opencv_ffmpeg341_64.dll
这时候需要我们手动设置资源路径,

可以通过–add-binary参数设置,也可以在spec文件添加binaries参数,这个参数是个list,每个元素是个二元组

binaries=[('D:\\ProgramSourceCode\\PycharmProjects\\video_proc\\venv\\Lib\\site-packages\\cv2\\opencv_ffmpeg341_64.dll', './cv2')]
  • 1

前一个代表原始资源路径,后一个代表拷贝到可执行文件夹的文件路径。

1.2 是否变成一个exe主文件

来自:https://blog.csdn.net/kevinshift/article/details/104880101

# 打包成一个exe文件
Pyinstaller -F py_word.py 打包exe
# 打包成一个文件夹
Pyinstaller py_word.py 打包exe
  • 1
  • 2
  • 3
  • 4

pyinstaller打包文件包含两种情况:
(1)将py文件、python及第三方库全部打包为一个单独的Exe中。

(2)将以上三者打包形成一个文件夹,文件夹中包含一个Exe,一个python,及其依赖的第三方库。
二者通过不同的选项
二者的优劣对比:
(a)启动时间
单一可执行文件比文件夹的启动时间要长
因为当程序运行时,单一的可执行文件需要解压程序的第三方依赖文件到临时文件夹中。
(b)文件结构
单一可执行文件的文件结构和工程目录是一样的,但是生成文件夹就不一样了,若程序中包含相对路径,这个相对路径自然基于的是文件夹目录,这点需要注意。
在打包过程出现问题时,可以生成文件结构,进入细致查看发生了什么。

1.3 一些依赖如果没有安装

一个当然是pip安装重新打包,还可以

pyinstaller -F xxxx.py  --hidden-import=numpy --hidden-import=pandas  --hidden-import=openpyxl

  • 1
  • 2

2 虚拟环境打包

按照极简版,其可能会将你所有依赖打包,就会让文件变得非常大。
可以使用conda的虚拟环境

#创建虚拟环境
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
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl

#Pyinstaller打包
Pyinstaller -F -w -i apple.ico py_word.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

安装完之后,可以在自己的虚拟镜像里面python x.py试一下是否可以正常执行,就可以开始Pyinstaller 打包


3 其他打包需求

3.1 加密打包

加密打包
来自: https://zhuanlan.zhihu.com/p/470301078
虽然被如此轻松的解密手段

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/882436
推荐阅读
相关标签