当前位置: 首页 > news >正文

python 打包EXE

注: 从个人博客园 移植而来

环境: Windows7 Python 2.7

参考:

使用pyinstaller打包python程序

Pyinstaller 打包发布经验总结

Using PyInstaller


简介

使用python引用第三方的各种模块编写一个工具后,如果想发给其他人,他们必须配置相关的环境才能使用,因此将python打包成exe就会方便许多。

我们可以使用Pyinstaller,主要原理是:

读取你的python脚本,分析其代码以发现脚本执行所需的其它模块和库(依赖项),然后将这些文件的一起放到特定的单个文件夹或可执行文件中,生成exe执行文件。

官方文档:Document


配置

安装命令:

pip install pywin32       # pyinstaller会需求pywin32的某些接口
pip install pyinstaller

若在安装pyinstaller的时候,可能会报错。我们可进入官网下载

img

下载文件后,解压,cmd命令窗口进入到对应目录下 ;输入命令:python setup.py install

如此,pyinstaller的环境算是配置好了。验证的话

# 在cmd中输入命令,检测下版本号
pyinstaller -v # 或者通过pip,检测下包是否安装
pip list

简单使用

新建文件夹test,并编写一个简单的python文件,内容如下:

print("Hello PythonInstaller")
# 添加此处为了避免exe打开一闪而过
input()                        

在test中打开cmd窗口,输入命令:

# -F 表示生成结果是exe文件 -D表示结果生成一个目录
pyinstaller -F test.py '''
注意:
针对于单一的python文件,推荐使用 -F 命令,
若python文件调用了相关的资源文件,建议在生成exe的目录下将资源文件拷贝到该目录下,否则会报错
'''

cmd会在test文件夹下生成build,dist文件目录:

  • build: 用于存放pyinstaller运行的中间文件,文件夹内的warn文件用于记录打包时遇到的一些问题,可作为参考

  • dist: 用于存放生成的exe文件

注意:针对于单一的python文件,推荐使用-F命令,若python文件调用了相关的资源文件,建议将资源文件拷贝生成的exe目录下,否则会报错。

比如,我有这样的在cmd窗口输入汉字生成拼图的工具,其目录为:

img

  • res: 放置了python拼图需要的.png或.jpg资源文件

  • HZK16 : 用于将汉字解析为矩阵的字库文件

  • tool.py : 执行脚本

在该目录下,打开cmd命令窗口,输入命令:

pyinstaller -F tool.py

命令会额外生成build,dist文件夹,此时我们需要将res,HZK16复制粘贴到dist目录下,然后点击tool.exe 才能执行成功。效果图为:

img

HZK16相关示例: 参考

复杂使用

一般情况下,我们将python打包exe会包含多个代码文件,资源等,故此我们需要了解下pyinstaller的命令。

参数描述命令
-h显示帮助pyinstaller -h
-v显示版本号pyinstaller -v
-F生成一个exe文件,所有的依赖,资源和代码都打包到exe中pyinstaller -F test.py
-D生成一个目录,包含所有的依赖,资源和exepyinstaller -D test.py
–log-level LEVELLEVEL有5个等级,分别为: TRACE, DEBUG, INFO, WARN, ERROR用于控制编译时pyi打印的消息-F --log-level ERROR
-n NAMENAME为生成.exe和.spec的文件名,默认:执行脚本的名称-F test.py -n NewTest
-p DIRDIR为额外的import路径,若有多个,用“;”隔开
–hidden-import NAMEpyi在分析的过程中,有些import没有分析出来,可使用此命令,且此命令可多次使用
–exclude-modeulepyi分析的相互关联的库,若某些库没用,可使用该命令,用于减少生成文件的大小
–key KEYKEY是用于加密python字节码的秘钥,一般为16的字符串
-d调试使用,用于生成exe时,输出pyi的一些日志,有助于查错
-c显示命令行窗口
-w隐藏命令化窗口,可用于GUI程序
-i NAMENAME为应用程序的icon图标,windows上使用.ico Mac上使用.icns图标的获取可参考:https://www.easyicon.net/pyinstaller -F test.py -i icon.ico
–version-file FILEFILE为应用程序添加的版本信息文件
-m FILEFILE为应用程序添加的manifest文件

为了更便捷的打包exe,我们可以通过自定义配置.spec文件来完成打包。

# 在脚本的目录下都会生成指定的test.spec文件
pyinstaller -F test.py 
pyinstaller -D test.py# 我们也可以这样生成,此种生成不会产生build,dist文件夹
# 官网:https://pyinstaller.readthedocs.io/en/stable/spec-files.html
pyi-makespec test.py

该文件实质上是可执行的python文件,pyInstaller通过相关的配置来构建应用程序。当spec文件构建后,其大多数命令选项

都编码在文件中,因此若在命令行中使用已包含的命令,将会被忽略。尚且有效的命令行选项有:

--upx-dir=      --distpath=       --workpath=
--noconfirm     --ascii           --clean

文件的显示内容如下:

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None# 用于分析.py文件依赖的模块和库
a = Analysis(# scripts: 指定文件名的.py脚本列表,不同文件之间以","分割['test.py'],# 在sys.path之间搜索的可选路径列表,一般已生成.spec的默认目录为准pathex=['C:\\Users\\wangxuhe\\Desktop\\test'],# 附加二进制文件(.dll等)的可选列表,命令:--add-binarybinaries=[],# 要包含的附加数据文件的可选列表,命令:--add-datadatas=[],# 要包含的附加隐藏模块的可选列表,命令:--hidden-import MODULENAMEhiddenimports=[],# 用于搜索钩子的附加路径的可选列表,命令: --additional-hooks-dir HOOKSPATHhookspath=[],# 可选的脚本列表,用作用户的运行时挂钩。命令:--runtime-hook RUNTIME_HOOKS runtime_hooks=[],# 一个可选的模块或包名列表(它们的Python名),该列表将被忽略。命令:--exclude-module EXCLUDESexcludes=[],# 若为True,则不希望在搜索Windows SxS程序集时遵循版本重定向win_no_prefer_redirects=False,# 若为True,则将所有绑定的Windows SxS程序集更改为私有程序集以强制执行程序集版本win_private_assemblies=False,cipher=block_cipher,# 若为True,不要将源文件放在归档文件中,而是将它们作为单独的文件保存noarchive=False)# 用于创建包含所有python模块的Zlib,包含程序运行需要的所有依赖文件
pyz = PYZ(a.pure, # pyz的文件名a.zipped_data,# 用于加密python字节码的密码cipher=block_cipher)# 用于构建最终的执行文件,由Analysis和PYZ生成
exe = EXE(pyz,a.scripts,[],# 若为True,将exe构建转发给pkgexclude_binaries=True,# 可执行文件.exe的文件名name='test',# exe的图标资源icon='icon.ico',# 若为True,则可从执行文件获取调试信息debug=False,# window默认False,非windows使用,用于引导程序忽略可忽略的信息bootloader_ignore_signals=False,strip=False,upx=True,# 若为true,则显示控制台console=True)# 用于生成非执行文件外的文件夹,在单文件模式下不会调用,且该接口也可以没有故此不再描述 
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,strip=False,upx=True,upx_exclude=[],name='test')

未完待续…

http://www.lryc.cn/news/13757.html

相关文章:

  • CANopen概念总结、心得体会
  • 【2】MYSQL数据的导入与导出
  • Kaggle系列之CIFAR-10图像识别分类(残差网络模型ResNet-18)
  • ESP-C3入门11. 创建最基本的HTTP请求
  • K8S+Jenkins+Harbor+Docker+gitlab集群部署
  • 看见统计——第四章 统计推断:频率学派
  • 2023年2月访问学者博士后热门国家出入境政策变化汇总
  • “离开浪浪山”是假象,80%年轻人下班后还在学习,真实是想先上个山。
  • Kotlin 33. CompileSdkVersion 和 targetSdkVersion 有什么区别?
  • 实用调试技巧——“C”
  • JavaScript - 函数
  • Cesium 卫星轨迹、卫星通信、卫星过境,模拟数据传输。
  • 2023年湖北中级职称(工程类建筑类)报名条件和要求是什么?
  • socket编程复习
  • 深度学习神经网络基础知识(三)前向传播,反向传播和计算图
  • 一图说明 monorepo 落地流程方案
  • SAP ABAP WRITE语法大全
  • 微信小程序自定义全局组件showModal
  • 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|考试知识点
  • startForegroundService与startService 使用浅析
  • django项目实战三(django+bootstrap实现增删改查)进阶分页
  • Python 之 Pandas DataFrame 数据类型的简介、创建的列操作
  • 华为OD机试真题Python实现【5键键盘的输出】真题+解题思路+代码(20222023)
  • IDEA全家桶式讲解 | IDEA安装、使用、断点调试、Git、插件 (第二篇)
  • 音视频基础之封装格式与音视频同步
  • 外籍在读博士|赴新西兰奥克兰大学双院士导师麾下联合培养
  • Learning C++ No.11【string类实现】
  • 实力见“证”:Tapdata 技术创新与发展潜力广受认可
  • 【C++修炼之路】18.map和set
  • ChatGPT原理与技术演进剖析