python 打包EXE
环境:Windows7 Python 2.7
使用python引用第三方的各种模块编写一个工具后,如果想发给其他人,他们必须配置相关的环境才能使用,因此将python打包成exe就会方便许多。
PyInstaller:
打包exe的话,我们可以使用Pyinstaller,它的主要原理是读取你的python脚本,分析其代码以发现脚本执行所需的其它模块和库(俗称依赖项)。然后,将这些文件的副本一起放到特定的单个文件夹或可执行文件中。
官方文档:https://pyinstaller.readthedocs.io/
配置
安装命令:
pip install pywin32 # pyinstaller会需求pywin32的某些接口
pip install pyinstaller
若在安装pyinstaller的时候,可能会报错。我们可进入其官网: http://www.pyinstaller.org/downloads.html
下载文件后,解压,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窗口输入汉字生成拼图的工具,其目录为:
res: 放置了python拼图需要的.png或.jpg资源文件
HZK16 : 用于将汉字解析为矩阵的字库文件
tool.py : 执行脚本
在该目录下,打开cmd命令窗口,输入命令:
pyinstaller -F tool.py
命令会额外生成build,dist文件夹,此时我们需要将res,HZK16复制粘贴到dist目录下,然后点击tool.exe 才能执行成功。效果图为:
若想获取源码,可参考GitHub: https://github.com/wangxuhe/GameBox/tree/master/Project/tool/HZK16
复杂使用
一般情况下,我们将python打包exe会包含多个代码文件,资源等,故此我们需要了解下pyinstaller的命令。
官网参考:https://pyinstaller.readthedocs.io/en/stable/usage.html
参数 | 描述 | 命令 |
-h | 显示帮助 | pyinstaller -h |
-v | 显示版本号 | pyinstaller -v |
-F |
生成一个exe文件,所有的依赖,资源和代码都打包到exe中 |
pyinstaller -F test.py |
-D |
生成一个目录,包含所有的依赖,资源和exe |
pyinstaller -D test.py |
--log-level LEVEL |
LEVEL有5个等级,分别为: TRACE, DEBUG, INFO, WARN, ERROR 用于控制编译时pyi打印的消息 |
-F --log-level ERROR |
-n NAME | NAME为生成.exe和.spec的文件名,默认:执行脚本的名称 | -F test.py -n NewTest |
-p DIR | DIR为额外的import路径,若有多个,用“;”隔开 | |
--hidden-import NAME | pyi在分析的过程中,有些import没有分析出来,可使用此命令,且此命令可多次使用 | |
--exclude-modeule | pyi分析的相互关联的库,若某些库没用,可使用该命令,用于减少生成文件的大小 | |
--key KEY | KEY是用于加密python字节码的秘钥,一般为16的字符串 | |
-d | 调试使用,用于生成exe时,输出pyi的一些日志,有助于查错 | |
-c | 显示命令行窗口 | |
-w | 隐藏命令化窗口,可用于GUI程序 | |
-i NAME |
NAME为应用程序的icon图标,windows上使用.ico Mac上使用.icns 图标的获取可参考:https://www.easyicon.net/ |
pyinstaller -F test.py -i icon.ico |
--version-file FILE | FILE为应用程序添加的版本信息文件 | |
-m FILE | FILE为应用程序添加的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-binary binaries=[], # 要包含的附加数据文件的可选列表,命令:--add-data datas=[], # 要包含的附加隐藏模块的可选列表,命令:--hidden-import MODULENAME hiddenimports=[], # 用于搜索钩子的附加路径的可选列表,命令: --additional-hooks-dir HOOKSPATH hookspath=[], # 可选的脚本列表,用作用户的运行时挂钩。命令:--runtime-hook RUNTIME_HOOKS runtime_hooks=[], # 一个可选的模块或包名列表(它们的Python名),该列表将被忽略。命令:--exclude-module EXCLUDES excludes=[], # 若为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构建转发给pkg exclude_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')
未完待续....
参考:
https://blog.csdn.net/polyhedronx/article/details/81740818
https://blog.csdn.net/weixin_42052836/article/details/82315118