pyinstaller教程(二)-快速使用(打包python程序为exe)

1.介绍

PyInstaller 是一个强大的 Python 打包工具,可以将 Python 程序打包成独立的可执行文件。以下会基于如何在win系统上将python程序打包为exe可执行程序为例,介绍安装方式、快速使用、注意事项以及特别用法。

2.安装方式

通过 pip 安装
PyInstaller 可以通过 pip 命令在线安装。这是最简单和推荐的安装方式。

pip install pyinstaller

这种方法适用于所有操作系统

3.快速开始

3.1 基本用法

打包一个 无任何调用及依赖的Python脚本 非常简单,只需指定作为程序入口的脚本文件即可。

pyinstaller myscript.py

这个命令执行会生成下图文件

  • 当前目录下写入 myscript.spec(与脚本名相同)
  • 在当前目录创建 build目录,并写入一些日志文件和工作文件。
  • dist如果不存在则在当前目录中创建。
  • 将可执行文件夹写入文件夹 myscriptdist,dist包含一个目录 _internal和一个文件 myscript.exe_internal目录中包含脚本所有的额外依赖包括python解释器、dll动态库等。

pyinstaller目录结构

dist/myscript

如何想打包成一个exe文件的,可指定参数 -F或者--onefile,例如,

   pyinstaller -F myscript.py 

其中 -F 参数表示生成单个可执行文件。
dist/myscript

参数(仅解释部分个人认为还算常用的参数)

参数参数描述
-F, –onefile打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-w,–windowed,–noconsole使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console在部署时包含 TCL/TK
–icon=<FILE.ICO>file.ico添加为可执行文件的资源**(只对Windows系统有效),改变程序的图标 pyinstaller -**i ico路径 xxxxx.py
–icon=<FILE.EXE,N>file.exe的第n个图标添加为可执行文件的资源**(只对Windows系统有效)**
-n NAME, –name=NAME可选的项目**(产生的spec)名字.如果省略,第一个脚本的主文件名将作为spec**的名字

3.2 高阶用法

既然是高阶用法,那便需要更深层次的理解,并能解决一些困难问题,例如多脚本调用、复杂依赖等问题。本章节首先从spec文件讲起,基于 spec文件会讲解如何通过修改spec文件以达到一些目的。

3.2.1 spec介绍

上一节提到在执行 pyinstaller myscript.py后会生成 myscript.spec文件,该文件实际上是决定整个打包过程的配置文件,因此对于pyinstaller的高阶用法将针对spec文件展开。

首先认识一下该文件的内容:

# -*- mode: python ; coding: utf-8 -*-# 第一步:分析入口脚本,分析所有导入以及依赖。
# 分析完后a会产生4个变量:
#     a.pure 依赖的纯 python 文件->("module", "D:\\XXX\XXX\module.py", "PYMODULE")
#     a.scripts 依次执行的脚本文件->('hook', 'D:\\XXX\\hook.py', 'PYSOURCE')
#     a.binaries 依赖的二进制文件->('python38.dll', 'D:\\XXX\\python38.dll', 'BINARY')
#     a.datas 依赖的非二进制文件->('input.txt', 'D:\\XXX\\input.txt', 'DATA'
a = Analysis(['myscript.py'],	# 入口python脚本,即待分析的脚本入口pathex=[],		# 模块搜索的路径,默认当前环境变量binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]datas=[],		# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块noarchive=False,optimize=0,
)# 创建包含python的主程序以及依赖项,该部分代码会被打包进exe文件,在exe运行时会解压到临时文件然后被调用。
pyz = PYZ(a.pure)# 创建exe文件
exe = EXE(pyz,				# 包含了纯python代码a.scripts,				# 包含了data以及依赖项[],					# 包含需要打包到 exe 文件内的二进制文件exclude_binaries=True,		# 默认为True,所有的二进制文件将被排除在exe之外name='myscript',			# exe文件命名debug=False,			# 打包过程是否打印调试信息bootloader_ignore_signals=False,strip=False,upx=True,console=True,			# 默认为True,在控制台窗口中运行,否则作为后台进程运行disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
# 组织收集exe的依赖
coll = COLLECT(exe,a.binaries,a.datas,strip=False,upx=True,upx_exclude=[],name='myscript', # dist目录下的目录名称
)

然后已经存在该spec文件后,可以通过执行如下命令进行打包。

pyinstaller myscript.spec

3.2.2 适用场景

(1)打包的依赖库缺少文件、存在额外的数据要拷贝
# -*- mode: python ; coding: utf-8 -*-########################>>重点在这里<<#####################################
# 加入 打包过程中遇到numpy的依赖问题
import os
from importlib.util import find_spec
# 空列表,用于准备要复制的数据
datas = []
# 存在依赖问题的模块
manual_modules = ['numpy', 'librosa']
for m in manual_modules:if not find_spec(m): raise Except(f"{m}模块未找到!")datas.append((os.path.dirname(find_spec(m).origin, m))  	# 以 (src, dst) 元组的形式添加到 datas 列表# 额外复制的文件
my_files = ['/data/input.txt', ]
for file in my_files:datas.append((file, '.'))		# 将文件复制到打包目标路径的根目录
###########################################################################
a = Analysis(['myscript.py'],	# 入口python脚本,即待分析的脚本入口pathex=[],		# 模块搜索的路径,默认当前环境变量binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]datas=datas,	# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块noarchive=False,optimize=0,
)......
(2)暴露打包后可能会修改的python脚本

可以利用a.datas的特点,将一些纯python脚本在打包时排除在exe之外,例如将核心代码 myscript.myscripyt_core.py排除在exe外,以便后期修改代码。

其原理是将保存在 a.pure中的纯python代码替换到 a.datas中。

......
a = Analysis(['myscript.py'],	# 入口python脚本,即待分析的脚本入口pathex=[],		# 模块搜索的路径,默认当前环境变量binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]datas=[],		# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块noarchive=False,optimize=0,
)
######################>>重点在这里<<###########################
# 需要暴露在外的python(不带 .py)
my_modules = ['myscript.myscript_core"]
# 将被排除的模块添加到 a.datas,同时将module排除在pure_list
pure_list = []
for mod in a.pure:if mod[0] in my_modules:mod[-1] = "DATA"a.datas.append(mod)else:pure_list.append(mod)
a.pure = pure_list
############################################################### 创建包含python的主程序以及依赖项,该部分代码会被打包进exe文件,在exe运行时会解压到临时文件然后被调用。
pyz = PYZ(a.pure)......

4. 注意事项

在打包复杂的python工程或者项目时请注意:

  1. 务必指定入口脚本(不可使用-m 模块方式执行)。
  2. python脚本中尽量避免使用from XXX import *。
  3. 避免使用importlib来动态导入模块,避免使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技MES系统:食品加工安全的实时监控与智能管理

万界星空科技MES系统通过集成多种技术和功能&#xff0c;能够实时监控食品加工过程中各环节的安全风险。以下是对该系统如何实现实时监控的详细分析&#xff1a; 一、集成传感器和数据分析技术 万界星空科技MES系统利用集成的传感器和数据分析技术&#xff0c;实时监控生产过程…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

数学建模入门

目录 文章目录 前言 一、数学建模是什么&#xff1f; 1、官方概念&#xff1a; 2、具体过程 3、适合哪一类人参加&#xff1f; 4、需要有哪些学科基础呢&#xff1f; 二、怎样准备数学建模&#xff08;必备‘硬件’&#xff09; 1.组队 2.资料搜索 3.常用算法总结 4.论文撰写的…

微前端解决方案

在实施微前端架构时&#xff0c;前端框架和技术的选型是非常重要的。不同的框架和技术有着不同的优缺点&#xff0c;需要结合具体的应用场景进行选择。一、常见的微前端解决方案 Web Components Web Components&#xff08;包括Custom Elements、Shadow DOM和HTML Imports&…

数据建设实践之大数据平台(一)准备环境

大数据组件版本信息 zookeeper-3.5.7hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1dataxapache-dolphinscheduler-3.1.9大数据技术架构 大数据组件部署规划 node101node102node103node104node105datax datax datax ZK ZK ZK RM RM NM

HTML网页大设计-家乡普宁德安里

代码地址: https://pan.quark.cn/s/57e48c3b3292

二分图——AcWing 257. 关押罪犯

目录 二分图 定义 运用情况 注意事项 解题思路 AcWing 257. 关押罪犯 题目描述 运行代码 代码思路 改进思路 二分图 定义 二分图&#xff08;Bipartite Graph&#xff09;是一种特殊的图&#xff0c;在这种图中&#xff0c;顶点可以被分成两个互不相交的集合&…

C语言 | Leetcode C语言题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int ans 0;f…

硬盘HDD:AI时代的战略金矿?

在这个AI如火如荼的时代&#xff0c;你可能以为硬盘HDD已经像那些过时的诺基亚手机一样&#xff0c;被闪存和云存储淘汰到历史的尘埃里。但&#xff0c;别急着给HDD们举行退休派对&#xff0c;因为根据Finis Conner这位硬盘界的传奇人物的说法&#xff0c;它们非但没退场&#…

Linux进程——子进程详解

文章目录 查看进程的另一种方式如何创建子进程fork函数详解fork函数的用法fork函数做了什么为什么fork有两个返回值父子进程的运行顺序是什么样的为什么fork函数的两个返回值不同 在上一节中我们简单介绍了进程的概念&#xff0c;还有父进程和子进程 这篇文章的主要内容是介绍…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

护网HW面试——redis利用方式即复现

参考&#xff1a;https://xz.aliyun.com/t/13071 面试中经常会问到ssrf的打法&#xff0c;讲到ssrf那么就会讲到配合打内网的redis&#xff0c;本篇就介绍redis的打法。 未授权 原理&#xff1a; Redis默认情况下&#xff0c;会绑定在0.0.0.0:6379&#xff0c;如果没有采用相关…

暴雨让服务器不怕热҈热҈热҈热҈

在AI算力呈几何倍数增长的趋势下&#xff0c;算力逐渐朝着“高性能、高密度、高耗能“发展。在高耗能的算力下&#xff0c;AI服务器功率已逐步逼近风冷散热极限&#xff0c;而液冷作为更加高效、低能耗的制冷技术&#xff0c;逐渐成为了高密度算力散热场景的首选方案。 液冷的…

网络安全----防御----防火墙nat以及智能选路

前面要求在前一篇博客 网络安全----防御----防火墙安全策略组网-CSDN博客 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的ht…

Jenkins中Node节点与构建任务

目录 节点在 Jenkins 中的主要作用 1. 分布式构建 分布式处理 负载均衡 2. 提供不同的运行环境 多平台支持 特殊环境需求 3. 提高资源利用率 动态资源管理 云端集成 4. 提供隔离和安全性 任务隔离 权限控制 5. 提高可扩展性 横向扩展 高可用性 Jenkins 主服务…

Python excel知识库批量模糊匹配的3种方法实例(fuzzywuzzy\Gensim)

前言 当然&#xff0c;基于排序的模糊匹配&#xff08;类似于Excel的VLOOKUP函数的模糊匹配模式&#xff09;也属于模糊匹配的范畴&#xff0c;但那种过于简单&#xff0c;不是本文讨论的范畴。 本文主要讨论的是以公司名称或地址为主的字符串的模糊匹配。 使用编辑距离算法进…

Is Temperature the Creativity Parameter of Large Language Models?阅读笔记

最近有小伙伴来问LLM的参数该如何设计&#xff0c;废话不多说来看看paper吧。首先&#xff0c;常见的可以进行调参的几个值有temperature&#xff0c;top-p和top-k。今天这篇文章是关于temperature的。 原文链接&#xff1a;https://arxiv.org/abs/2405.00492 temperature如果…

OSPF.中DBD数据包

指定路由器---DR的身份 备份指定路由器---BDR的身份&#xff08;RID&#xff09;注意在一个广播域中的所有设备DR和BDR的认知必须统一。 只有DR和BDR会监听224.0.0.6的组播地址 会发出多个数据包 作用&#xff1a; 1.用来主从选举&#xff08;没有携带lsa再要信息的DBD报文…

《斯科特·凯尔比的风光摄影手册》读书笔记

写在前面 《斯科特凯尔比的风光摄影手册》读书笔记整理没有全部读完&#xff0c;选择了感兴趣的章节理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;…

LabVIEW心电信号自动测试系统

开发了一种基于LabVIEW的心电信号自动测试系统&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块&#xff0c;能够高效、准确地完成心电信号的测量与分析。 硬件系统…