Python是一种高级编程语言,它具有易学易用、跨平台等优点,因此在开发中得到了广泛的应用。然而,Python代码必须在Python编程环境中才能运行,这对于一些没有编程基础的用户来说非常不方便。因此,将Python代码打包成exe可执行文件是一种很好的解决方案。
除了上一节教程中介绍的使用PyInstaller模块打包方法,还可以通过Python的py2exe模块将Python代码打包成Windows的exe可执行文件。
1、安装py2exe模块
想要通过py2exe模块把Python程序打包成exe文件,首先,同样需要安装py2exe模块,打开cmd终端窗口输入以下命令安装py2exe模块:
pip install py2exe
执行以上安装命令,如果运行结果出现“Successfully installed”,说明已经安装成功;如果运行结果出现“Requirement already satisfied”,说明该模块已经被安装过,不用再安装。不懂得安装第三方库,可以参考本教程第10章中第9节和第10节里面的内容。
2、准备一个简单的Python程序
首先,我们准备一个用Python编写的“转盘抽奖”程序,用于打包成exe文件。打开第2章教程中介绍的Pyhint编辑器,在代码框中输入以下程序代码,点击“运行”按钮就会弹出转盘抽奖的页面。在转盘抽奖界面中,点击“开始”按钮后抽奖界面开始转动,速度由快到慢,直到自动停止,最后停止的区域就是中奖的区域。
import tkinter as Tkinter
from tkinter import *
import random
from tkinter import messagebox as tkMessageBox
is_run = False
def lottery_whirl(data, i, number):
global is_run
if i == 0:
j = 0
else:
j = i % 8
data[j-1]['bg'] = '#CCCCCC'
data[j]['bg'] = '#FF0000'
wait = [a for a in range(100, 300, 10)] + [b for b in range(300, 600, 300 // (number-28))] + \
[c for c in range(600, 1200, 120)] + [d for d in range(1200, 1800, 200)]
if i < number:
window.after(wait[i], lottery_whirl, data, i + 1, number)
else:
is_run = False
if data[j] == label1:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得一等奖 !")
if data[j] == label2:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得二等奖 !")
if data[j] == label3:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得三等奖 !")
if data[j] == label4:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得一等奖 !")
if data[j] == label5:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得二等奖 !")
if data[j] == label6:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得三等奖 !")
if data[j] == label7:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得二等奖 !")
if data[j] == label8:
tkMessageBox.showinfo("抽奖结果:", "恭喜获得三等奖 !")
def lottery_start(data):
global is_run
if is_run:
return
is_run = True
for x in range(len(data) - 1):
data[x]['bg'] = '#CCCCCC'
number = random.randint(30, 53)
lottery_whirl(data, 0, number)
def create_label(name, x, y):
label = Label(window, text=name, width=13, height=3, bg='#CCCCCC', font='宋体 -18 bold')
label.place(anchor=NW, x=x, y=y)
return label
if __name__ == '__main__':
window = Tkinter.Tk()
window.geometry('500x290+250+150')
window.title('转 盘 抽 奖 器')
bg_label = Label(window, width=80, height=24, bg='#ECf5FF')
bg_label.place(anchor=NW, x=0, y=0)
label1 = create_label('一等奖', 20, 20)
label2 = create_label('二等奖', 180, 20)
label3 = create_label('三等奖', 340, 20)
label4 = create_label('一等奖', 20, 110)
label5 = create_label('二等奖', 340, 110)
label6 = create_label('三等奖', 20, 200)
label7 = create_label('二等奖', 180, 200)
label8 = create_label('三等奖', 340, 200)
data = [label1, label2, label3, label5, label8, label7, label6, label4]
button_core = Button(window, text='开 始', command=lambda: lottery_start(data), width=130, height=53, bg='#00CD00',font='宋体 -18 bold', bitmap='gray50', compound=Tkinter.CENTER)
button_core.place(anchor=NW, x=180, y=110)
window.mainloop()
3、使用py2exe模块将Python程序打包成exe文件
前面我们已经介绍了,在Pyhint编辑器的代码框中输入“转盘抽奖”的程序代码后,点击“运行”按钮就会弹出“转盘抽奖”的程序页面。现在,我们在Pyhint编辑器的默认开发目录“Pyhint\Learn-Python\test”下,创建一个文件夹lottery,然后进入lottery文件夹创建如下两个文件:
Pyhint\Learn-Python\test\lottery
├── lottery.py
└── setup.py
项目结构如下:
Pyhint\Learn-Python\test\lottery\lottery.py
Pyhint\Learn-Python\test\lottery\setup.py
其中,lottery.py文件就是我们要打包的Python程序。现在打开lottery.py文件,输入“转盘抽奖”的Python程序代码后保存该文件。
上面我们创建的另外一个文件setup.py是一个配置文件,用来指定打包选项和依赖项。现在我们在setup.py文件中输入以下代码并保存:
from distutils.core import setup
import py2exe
options = {"py2exe" : {
# 启用压缩
"compressed":1,
# 优化等级
"optimize":2,
# 表示所有的依赖都会被打包成一个exe文件
"bundle_files":1
}
}
setup(
# 自定义版本号
version='5.0',
# 类似于打开任务管理器后,后边的进程描述
description='exe的名称',
# 作者
name='作者名称',
# 通过在options变量中设置各种配置选项
options=options,
# 不生成library.zip的库文件
zipfile=None,
# 打包图形界面程序
windows=[{'script':'lottery.py',
# 如果需要的话,下面可以添加exe文件的图标
#'icon_resources': [(1, 'your_icon.ico')]
}]
)
创建完lottery.py和setup.py两个文件后,同样暂时退出360等杀毒软件,然后,点击Pyhint编辑器上面的“打开终端”按钮,打开黑色的cmd终端窗口,输入“cd lottery”然后按下Enter回车键进入lottery目录,确保在终端中与setup.py位于同一目录中。(注意:在终端中可以使用“cd 文件夹名”命令在目录之间移动。),然后,在终端中运行打包命令“python setup.py py2exe”并按下Enter回车键开始打包,耐心等待一会儿,直到提示“Building 'dist\lottery.exe'.”打包成功。如图:
执行打包成功后,会在同目录下生成build和dist两个文件夹。build文件夹是py2exe执行过程的中间文件夹,可以删掉。dist文件夹就是我们打包后的文件夹,里面包含了一个lottery.exe可执行文件和多个“.dll”文件,其中dll文件是程序运行所需要的文件,dll文件也被称为系统的动态链接库文件,里面包含程序使用的代码和数据的库。在Windows操作系统中,dll文件对于程序执行是非常重要的,因为有的程序在执行的时候,必须链接到dll文件,才能够正确地运行。如图:
这个时候一定要暂时退出360等杀毒软件,最后鼠标双击lottery.exe运行软件,就可以弹出“转盘抽奖”程序页面,如图:
这里需要注意的是,该dist文件夹包含了“转盘抽奖”程序所必须的东西,发布的时候要将整个dist文件夹一起打包发布。我们可以将该dist文件夹复制到其他Windows计算机上运行,在没有安装Python环境的Windows系统电脑中,进入dist文件夹直接双击lottery.exe即可弹出“转盘抽奖”程序页面。
与PyInstaller模块打包对比,PyInstaller模块可以将整个程序直接打包成一个exe可执行文件。而py2exe模块打包后会产生一个名为dist的文件夹,该文件夹包含了程序运行所需要的所有组件。py2exe模块的优点是专门为Windows平台设计,生成的exe文件与Windows环境更加兼容。但是,它只支持Windows平台,对于跨平台的应用程序来说不太适用。