用pyinstaller 将python项目 build成exe
1.安装pyinstaller
在cmd窗口 输入命令 pip install pyinstaller
2.pyInstaller原理简介
pyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,好处就是在运行者的机器上不用安装python和你的脚本
依赖的库。
pyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析
器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。
可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其
他包,或某个版本的Python,就可以直接运行了。
3.pyinstaller 打包 直接使用命令 pyinstaller [-F/-D] [-w/-c] [-i xxx.ico] hello.py
最简单的打包:切换到hello.py所在目录 打开cmd ,执行命令 pyinstaller hello.py,就打包完成。在当前目录下会生成build文件夹和 dist文件夹 和 hello.spec文件。
- hello.spec 文件 pyinstaller 就是根据这个文件种的配置来生成hello.exe的
- dist文件夹内的hello文件夹内 有可执行文件hello.exe。因为默认的-D,如果要在别的电脑运行,需要把这个hello文件夹整个复制过去。
- build文件夹的作用相当于PyInstaller的工作空间,PyInstaller运行相关的文件和日志都在这个文件夹中,打包完成后可以直接删除。
option解释
- -d :生成一个文件目录包含可执行文件和相关动态链接库和资源文件等,默认选项
- -f : 仅生成一个可执行文件,不暴露其他信息
- -w:表示程序运行后隐藏命令行窗口,当你不需要使用命令行窗口作为程序的I/O时,比如GUI程序,可以使用这个参数选项。
- -c: 默认选项,与-w相反,提供一个命令行窗口进行I/O。
- -i/--icon:指定exe程序图标
- --add-data SRC;DEST:指定需要添加非二进制文件路径或者文件夹路径,比如图片和pdf文件等,这个选项可以使用多次。这个命令其实就是将需要的文件或者文件夹拷贝到指定的路径下,在-D模式下,可以看情况在程序打包完成后自己手动拷贝过去。一条-add-data命令 就是往 .spec文件种添加 一条datas
例如 pyinstaller --add-data C:\test\data;data hello.py 命令。就会生成如下的hello.spec文件
a = Analysis(['hello.py'],
pathex=['C:\\test'],
binaries=[],
datas=[('C:\\test\\data', 'data')])
4.pyinstaller 打包 使用.spec 文件自定义打包
参考 Pyinstaller 打包发布经验总结 , Python中的图片打包与pyinstaller中的spec文件简介, Python三方库:PyInstaller(exe程序打包)
如果一个多文件和目录的Python项目包含 1.Python源代码文件;2.图标资源文件;3.其它资源文件
项目根目录C:\test , Python源代码文件在多个目录下:bin, lib\app, lib\models, lib\views;图标资源文件在lib\icon目录下;其它资源文件在data目录下,包括文本文件,视频文件。直接用命令行 比较复杂,可以用.spec文件 来自定义打包
1.生成.spec文件
执行命令 pyinstaller hello.py 就可以生成hello.spec文件
PS:执行这条命令 也会生成dist文件夹和build文件夹,直接删掉即可,因为这里只需要hello.spec。等会执行hello.spec才是最后build exe
2.修改.spec文件
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['hello.py'],
pathex=['C:\\test'],
binaries=[],
datas=[('C:\\test\\data','data')],
hiddenimports=[],
hookspath=[],
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,
[],
exclude_binaries=True,
name='hello',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='hello')
spec文件分为Analysis, pyz, exe, coll四个部分
- Analysis:首先是需要打包的py文件,通过一个字符串列表储存;然后是py文件的路径;datas是需要引用的文件(图片等)
- exe:要生成exe文件时,name是exe文件的名字, console是是否在打开exe文件时打开命令框
- coll:收集前三个部分的内容进行整合
3.执行 .spec文件 打包
执行命令 pyinstaller -D hello.spec 完成build exe
pyinstaller打包后的exe运行怎么去掉弹出的命令行提示窗口?
1.如果使用.spec文件的话, 在该文件中找到console=True修改为console=False
2.如果是直接指定python文件进行pyinstaller打包的话,需要添加 --noconsole : pyinstaller hello.py--noconsole