一、pyinstaller模块
1、安装模块
cmd输入命令
pip installer pyinstaller
即可。
pip会自动安装这个第三方包需要的依赖模块,比如pypiwin32这个依赖。
2、打包过程
(1)新建项目路径,路径自定义。
(2)将打包文件复制到项目路径下。
(3)打开cmd窗口,cd到项目路径。
(4)执行命令pyinstaller -F filename.py
ps:将需要的第三方库也复制到路径下,不过site-packages目录下的都可以自动识别。
3、详细参数
-F, –onefile
产生一个文件用于部署,只生成一个可执行文件。-D, –onedir
产生一个目录用于部署 (默认)。-K, –tk
在部署时包含 TCL/TK。-c, –nowindowed,–console
使用控制台子系统执行,无界面(默认)(只对Windows有效)。-w, –windowed,–noconsole
使用Windows子系统执行,当程序启动的时候不会打开命令行,需要有界面(只对Windows有效)。-p DIR, –path=DIR
设置导入路径(和使用PYTHONPATH效果相似),可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录。也可以使用多个-p参数来设置多个导入路径。-n NAME, –name=NAME
可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字。-i file.ico, –icon=<FILE.ICO>
将file.ico添加为可执行文件的资源(只对Windows系统有效)。–icon=<FILE.EXE,N>
将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)。-v FILE, –version=FILE
将verfile作为可执行文件的版本资源(只对Windows系统有效)。-a, –ascii
不包含编码,在支持Unicode的python版本上默认包含所有的编码。-d, –debug
产生debug版本的可执行文件。-s, –strip
可执行文件和共享库将run through strip,注意Cygwin的strip往往使普通的win32 Dll无法使用。-X, –upx
如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)。-o DIR, –out=DIR
指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录。如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下。PS:详细参数见官网https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html
1 | # 打包可执行程序步骤: |
注意,tkinter打包时图标问题:
tkinter修改默认图标后,打包时图标资源不能导入进去,解决方法是:把图标转化成base64数据后导入工程代码中。
(1)执行 create_icon.py ,将图标base64编码数据写入 icon.py 中:
1
2
3
4
5
6
7
8
9
10 import base64
# 将图标test.ico转为icon.py文件中的base64编码数据
open_icon = open("test.ico","rb")
b64str = base64.b64encode(open_icon.read()).decode() #注意最后将b''转换为str
open_icon.close()
write_data = "icon_img = '%s'" % b64str
f = open("icon.py","w+")
f.write(write_data)
f.close()(2)在工程文件 Test.py 中引入 icon.py 中的图标base64编码数据,用于修改tkinter默认图标:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import os
import base64
import tkinter
from icon import icon_img # 从icon.py导入图标的base64编码
window = tkinter.Tk()
window.title('TestTile')
window.geometry('500x300+200+200')
window.resizable(1,1)
tmp_icon = open("tmp_icon.ico", "wb+")
tmp_icon.write(base64.b64decode(icon_img)) # 生成临时图标
tmp_icon.close()
window.iconbitmap('tmp_icon.ico') # 添加临时图标到tkinter
os.remove("tmp_icon.ico") # 删除临时图标数据
window.mainloop()(3)使用pyinstaller进行打包
pyinstaller -i test.ico -w -F Test.py
(4)嫌过程麻烦,可将以上三步写为一个自动打包脚本 create_exe.py :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 import os
import time
import shutil
# 生成icon.py文件
os.system('python create_icon.py')
time.sleep(1)
# 执行pyinstaller打包
os.system("pyinstaller -i test.ico -w -F Test.py")
time.sleep(1)
# 取出exe可执行文件
if os.path.exists(r'dist/Test.exe'):
shutil.copyfile(r'dist/Test.exe', r'Test.exe')
else:
print('Error: dist/Test.exe not exists !')
# 将打包产生的文件全部移入Package文件夹
if not os.path.exists(r'Package'):
os.mkdir(r'Package')
if os.path.exists(r'__pycache__'):
shutil.move(r'__pycache__', r'Package/')
if os.path.exists(r'build'):
shutil.move(r'build', r'Package/')
if os.path.exists(r'dist'):
shutil.move(r'dist', r'Package/')
if os.path.exists(r'Test.spec'):
shutil.move(r'Test.spec', r'Package/')
持续更新…
最后更新: 2018年12月05日 13:21