人生苦短,我用python。

一、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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 打包可执行程序步骤:
# (1)新建项目路径,路径自定义。
# (2)将打包文件复制到项目路径下。
# (3)打开cmd窗口,cd到项目路径。
# (4)执行命令 > pyinstaller -F test.py -i test.ico # 生成带图标的可执行文件。

# 参数:
# -F 产生一个文件用于部署,只生成一个可执行文件。
# -D 产生一个目录用于部署 (默认)。
# -K 在部署时包含 TCL/TK。
# -c 使用控制台子系统执行,无界面(默认)(只对Windows有效)。
# -w 使用Windows子系统执行,当程序启动的时候不会打开命令行,需要有界面(只对Windows有效)。
# -p 设置导入路径,可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录。也可以使用多个-p参数来设置多个导入路径。
# -n 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字。
# -i 将.ico文件添加为可执行文件的资源(只对Windows系统有效),生成图标。
# -v 将verfile作为可执行文件的版本资源(只对Windows系统有效)。
# -a 不包含编码,在支持Unicode的python版本上默认包含所有的编码。
# -d 产生debug版本的可执行文件。
# -s 可执行文件和共享库将run through strip,注意Cygwin的strip往往使普通的win32 Dll无法使用。
# -X 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)。
# -o 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出

注意,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

原始链接: http://pythonfood.github.io/2017/12/30/python可执行程序/

× 多少都行~
打赏二维码