Python中Pyinstaller库
PyInstaller
一、 概述
1、 简介
pyinstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个 独立文件方便传递和管理。
PyInstaller支持Python 2.7和Python 3.3+。可以在Windows、Mac OS X和Linux上使用,但是并不是跨平台的,而是说你要是希望打包成.exe文件,需要在Windows系统上运行PyInstaller进行打包工作;打包成mac app,需要在Mac OS上使用。
2、 安装与更新
安装:pip install pyinstaller
更新:pip install --upgrade pyinstaller
注意:
1.PyInstaller 库会自动将 PyInstaller 命令安装到 Python 解释器 目录中,与 pip 或 pip3 命令路径相同,因此可以直接使用。
2.Windows上运行PyInstaller还需要PyWin32或者pypiwin32,其中pypiwin32在你安装PyInstaller的时候会自动安装。
二、 基本使用
1、 使用示例
语法:pyinstaller 选项 python源文件路径
不管这个 Python 应用是单文件的应用,还是多文件的应用,只要在使用 pyinstaller 命令时编译作为程序入口的 Python 程序即可。
PyInstaller工具是跨平台的,它既可以在 Windows平台上使用,也可以在 Mac OS X 平台上运行。在不同的平台上使用 PyInstaller 工具的方法是一样的,它们支持的选项也是一样的。
如,在python源文件的目录中打开终端,在进行输入

成功后会出现

2、 常用选项
-h,--help | 查看该模块的帮助信息 |
---|---|
-F,-onefile | 产生单个的可执行文件 |
-D,--onedir | 产生一个目录(包含多个文件)作为可执行程序 |
-a,--ascii | 不包含 Unicode 字符集支持 |
-d,--debug | 产生 debug 版本的可执行文件 |
-w,--windowed,--noconsolc | 指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
-c,--nowindowed,--console | 指定使用命令行窗口运行程序(仅对 Windows 有效) |
-o DIR,--out=DIR | 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
-p DIR,--path=DIR | 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径 |
-n NAME,--name=NAME | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
-i | 选择图标 |
上表列出的只是 pyinstaller 模块所支持的常用选项,如果需要了解 Pyinstaller 选项的详细信息,则可通过 pyinstaller -h 来查看
三、 多文件打包
1、 概念
这里是使用Windows进行打包的,当然其他平台的打包参数也是类似,可以去官网学习。
这里,我们需要学习,如何使用pyinstaller将多个py文件打包成一个EXE文件,供我们使用:
首先,我们需要学习,什么是多文件?
- 多文件就是有一个主文件,主文件依赖其余的py文件才能运行,通过
import
连接
我们需要使用的是.spec
文件
首先,我们创建一个目录结构:
2、 规范文件
然后,学习一个命令:
pyi-makespec main.py # 运行 pyinstaller ,以main.py为主文件,生成一个spec文件,作为一个标准
此规范文件也可以自己编写,同时,生成规范文件时,直接打包的那些参数都可以使用
运行后,其在运行目录下生成一个main.spec
文件,其内容为:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None #设置 加密,需要安装tinyaes第三方库,最多16位字符,此处在使用--key= 会有变化 a = Analysis( ['main.py'], # 运行的所有py文件,包括依赖的py文件 pathex=[], # 搜索导入的路径列表(此列表为项目绝对路径),包括选项给出的路径--paths,项目需要从什么地方导入自定义库 binaries=[], # 脚本需要的非python模块,包括--add-binary选项给出的名称,二进制数据 datas=[], # 应用程序中包含的非二进制文件,包括--add-data选项给出的名称,项目需要用到什么数据,比如图片,视频等。里面格式为tuple,第一个参数是文件路径,第二个是打包后所在的路径,其为一个元组:('image/*.png','data/image') hiddenimports=[], # 假如打包后打开exe显示module not found,就要把该库添加到hiddenimports里面了 hookspath=[], hooksconfig={}, # 挂钩配置选项由一个字典组成 runtime_hooks=[], excludes=[], # 假如你用的python有很多库,但是你不需要用到某个,那么就把它添加到里面去,可以压缩文件大小 win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, # 打包成EXE的脚本文件 # a.binaries, # 如果是单文件模式,则需要添加;多文件也可以添加 # a.zipfiles, # a.datas, [], exclude_binaries=True, # 是否排除二进制文件,为True时,为排除二进制的文件,当文件交大时包含二进制文件运行较快,如果是单文件,则没有这个选项 name='main', # 打包程序的名字 debug=False, # 是否启用调试功能 bootloader_ignore_signals=False, # runtime_tmpdir=None, # 生成单文件时需要这个参数,定义运行时的临时文件夹 strip=False, upx=True, # 打包的时候进行压缩,False表示不压缩;要用到一个压缩程序UPX,用于压缩文件,需要单独下载 console=True, # 打包后的可执行文件双击运行时屏幕会出现一个cmd窗口,不影响原程序运行,等于是是否加-w参数 disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, """添加选项,初始化时没有的""" icon="", # 指定应用程序的图标,传入路径,可以相对路径 ) coll = COLLECT( """ 如果是单文件模式,不需要这个COLLECT类,同时需要将: a.binaries, a.zipfiles, a.datas, 这些数据文件添加到EXE中 """ exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='main', )
如果需要更加详细的打包语法,可以到官方文档查看:https://pyinstaller.org/en/stable/index.html
在单文件模式下,不调用
COLLECT
,并且EXE
实例接收所有脚本、模块和二进制文件对于
Analysis
,我们主要要对:
script
: 写所有的py文件pathex
:写项目的地址,以及自定义库的地址datas
:静态文件数据的地址binaries
:二进制文件地址,如果有报错,或者,需要用的时候再添加其余的,不是常用的,直接运行不会影响程序的正常执行,但是想要更加精细一点的话,建议根据上面的注释来进行修改。
3、 项目打包
然后,我们就需要将我们的项目进行打包了:
我们首先编写main.spec
文件:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['main.py', "demo1.py"], pathex=["D:\\35005\\桌面\\demoTest"], binaries=[], datas=[("config\\*.json", "config")], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )
这里是进行单个文件的打包,打包完成后,我们需要把那个
config
文件夹移动到可执行程序的同级目录下,然后就可以运行成功了!
运行成功后的目录结构为:
最后,就可以把我们生成的程序发给别人使用啦!
本文来自博客园,作者:Kenny_LZK,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/15768871.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?