通过PyInstaller模块将Python程序打包成exe文件(第1节)


随着计算机技术的迅速发展,Python作为一种非常流行的编程语言越来越受欢迎,因为它具有简单、易读、易学的特点。对于许多Python开发人员来说,最常见的操作是将编写好的Python程序打包成可执行文件“exe”,以便它可以在没有安装Python环境的电脑上直接运行。本节教程将详细讲解如何将Python程序打包成“exe”可执行文件。

1、什么是exe可执行文件

exe文件英文全名是“Executable File”,翻译为可执行文件。一般来说,可执行文件扩展名为“.exe”。正确的exe文件一般可以在Windows平台上直接双击运行。我们通常用的各种软件都是通过桌面快捷方式打开的,而这个快捷方式的目标地址就是这个软件的一个exe文件。

exe文件是一种特殊的二进制文件,它包含了可执行的计算机程序代码。exe文件是计算机程序经过编译的结果,不需要额外安装编程环境,就可以被计算机的操作系统直接加载和执行。exe文件在计算机软件中具有重要的作用,它是用户运行各种应用程序的载体。

2、Python程序为什么要打包成exe文件

众所周知,运行Python程序必须要在本地电脑上安装Python环境,并且使用本地的代码编译器。我们可以设想一种情况:当我们已经开发了一款可用的桌面软件,并想提供给其他人使用,这个时候还需要在别人的电脑上安装好Python环境和编译器吗?那肯定比较麻烦,最快捷的方式就是将本地的“.py”文件直接打包成“.exe”的可执行文件,这样在任何电脑上只需要双击exe可执行文件,Python代码就可以直接被运行。

exe文件打包过程可以将Python源代码和依赖项转换为exe可执行文件。通过打包,原始的源代码和所有必要的程序文件被组合在一起,使程序可以在没有源代码的情况下运行。

3、Python程序打包成exe文件的好处

跨平台性:exe文件可以在Windows、Mac和Linux等操作系统上运行,而无需担心兼容性问题。通过创建一个独立的“.exe”文件,开发者实际上是在提供一个已经配置好的应用程序环境,这使得软件不再依赖于用户的系统设置。

方便分发:exe文件是一种独立的可执行文件,用户无需安装Python环境即可运行程序。这使得程序的分发和分享变得更加简单和方便,无需考虑用户的计算机是否已经安装了Python环境。

保护源代码:将程序打包成exe文件后,可以对程序进行加壳保护,提高代码的安全性,避免源代码直接暴露给用户,从而减少源代码被盗用或未经授权的篡改风险。尽管仍有exe文件被反编译的可能性,但相比源码直接发布,exe文件为开发者的“劳动成果”提供了额外的保障。

提高运行速度:将程序打包成exe文件后,可以减少运行时的依赖项和其他文件的加载时间,从而提高程序的执行速度。

便于部署和维护:打包后的exe文件可以轻松地部署到不同的计算机上,并且不需要手动安装和配置所需的组件,因此更易于维护和更新。

4、如何将Python程序打包成exe文件

Python有很多第三方库可以将Python程序打包成exe文件,常见的库包括PyInstaller、cx_Freeze、py2exe等,目前最常用的打包方式就是使用PyInstaller库。

(1)PyInstaller模块简介

PyInstaller库是一个将Python程序转换为独立可执行文件的第三方库。通过使用PyInstaller,你可以将Python程序转换为单个exe可执行文件,从而方便地在没有Python环境的电脑上运行。这样做可以简化程序的分发,避免用户安装Python环境的麻烦。

(2)PyInstaller模块安装

想要把Python程序打包成exe文件,首先需要安装PyInstaller模块,可以打开cmd终端窗口输入以下命令安装PyInstaller模块:

pip install pyinstaller

执行以上安装命令,如果运行结果出现“Successfully installed”,说明已经安装成功;如果运行结果出现“Requirement already satisfied”,说明该模块已经被安装过,不用再安装。不懂得安装第三方库,可以参考本教程第10章中第9节和第10节里面的内容。

(3)PyInstaller模块的基本用法和参数介绍

PyInstaller模块提供了一个快速且便捷的方式来打包Python程序代码。成功安装PyInstaller模块后,我们打开Pyhint编辑器的终端窗口,使用pyinstaller语句对“xxx.py”文件进行打包,最基础的打包语句如下:

pyinstaller -F xxx.py

以上pyinstaller语句中,“xxx.py”指的是需要打包的“.py”文件名,通过添加“-F”参数,可以生成单一的exe文件,打包完之后可以在项目文件的dist文件夹中找到exe可执行文件。

加入“-w”参数可以避免创建控制台窗口,当我们双击打包后的exe文件时,加入“-w”参数可以关闭启动的黑色控制台窗口,例如:

pyinstaller -F -w xxx.py

此外,如果想要为打包后的exe文件添加“xxx.ico”图标,可以添加“-i”参数,语句如下:

pyinstaller -F -w -i xxx.ico xxx.py

其中“xxx.ico”的位置是ico类型文件的名称,可以填写ico图标的路径或者把ico图标放在和“xxx.py”文件相同的文件夹下,才可顺利打包。如果你没有ico图标文件,可以使用在线图标制作工具将png、jpeg等格式的图片转换为ico格式,最后将ico图标文件命名为“xxx.ico”,并将其放置在与“xxx.py”相同的目录中。添加ico图标可以使exe文件更加美观和易识别。

PyInstaller模块打包的主要参数如下:

参数 描述
-F 只会打包为一个单独的.exe文件,所有的依赖包括库之类的全部都被打包进exe文件(单文件模式)
-D 打包后会产生一个.exe文件和其依赖文件的文件夹(多文件模式)
-C 产生一个黑色控制台(默认)调试时常常需要使用
-w 隐藏黑色控制台,一般是在写一个GUI应用时使用,只显示GUI窗口而隐藏控制台
-i 或 -icon 将可执行文件的图标改成指定的ico图标
-n 重命名.exe文件的名称
--splash 添加启动文件画面图,用于等待加载

PyInstaller模块通用的打包语句如下:

pyinstaller -F -w xxx.py -i xxx.ico -n xxx --splash xxx.png

以上打包语句中,“xxx.py”代表当前“.py”文件的文件名,“xxx.ico”代表ico图标的文件名,“-n xxx”中的“xxx”代表要重命名打包后exe文件的名称,“--splash xxx.png”中的“xxx.png”代表启动图片名称,默认把所有相关图片都放在与“xxx.py”文件同一个文件夹下,也可以使用图片文件的绝对路径引用。

(4)准备一个简单的Python程序

首先,我们准备一个用Python编写的游戏程序,用于打包成exe文件。打开第2章教程中介绍的Pyhint编辑器,在代码框中输入以下游戏代码,点击“运行”按钮就会弹出贪吃蛇的游戏页面。我们可以操作键盘的“上”、“下”、“左”、“右”方向键控制蛇的移动方向,吃到食物后得分增加,游戏结束时会提示“游戏结束”。

动手练一练:

import random
import tkinter as tk

class SnakeGame(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('贪吃蛇')
        self.geometry('400x400')
        self.canvas = tk.Canvas(self, bg='#000033', height=400, width=400)
        self.canvas.pack()
        self.snake = [(20, 20), (20, 21), (20, 22)]
        self.direction = 'Right'
        self.food = self.place_food()
        self.score = 0
        self.bind_all('<Key>', self.on_key_press)
        self.update_game()
    def place_food(self):
        while True:
            food = (random.randint(0, 39), random.randint(0, 39))
            if food not in self.snake:
                return food
    def on_key_press(self, event):
        key = event.keysym
        if key in ('Left', 'Right', 'Up', 'Down'):
            self.direction = key
    def update_game(self):
        head = self.snake[0]
        if self.direction == 'Left':
            new_head = (head[0] - 1, head[1])
        elif self.direction == 'Right':
            new_head = (head[0] + 1, head[1])
        elif self.direction == 'Up':
            new_head = (head[0], head[1] - 1)
        elif self.direction == 'Down':
            new_head = (head[0], head[1] + 1)
        if new_head in self.snake or new_head[0] < 0 or new_head[0] >= 40 or new_head[1] < 0 or new_head[1] >= 40:
            self.game_over()
            return
        self.snake.insert(0, new_head)
        if new_head == self.food:
            self.food = self.place_food()
            self.score += 10
        else:
            self.snake.pop()
        self.draw_game()
        self.after(100, self.update_game)
    def draw_game(self):
        self.canvas.delete(tk.ALL)
        for pos in self.snake:
            self.canvas.create_rectangle(pos[0] * 10, pos[1] * 10, pos[0] * 10 + 10, pos[1] * 10 + 10, fill='green')
        self.canvas.create_rectangle(self.food[0] * 10, self.food[1] * 10, self.food[0] * 10 + 10, self.food[1] * 10 + 10, fill='red')
        self.canvas.create_text(10, 10, anchor='nw', fill='white', text=f'得分: {self.score}')
    def game_over(self):
        self.canvas.create_text(200, 200, fill='white', text='游戏结束', font=('Arial', 24))

if __name__ == '__main__':
    game = SnakeGame()
    game.mainloop()

(5)使用PyInstaller模块将Python程序打包成exe文件

前面我们已经介绍了,在Pyhint编辑器的代码框中输入“贪吃蛇”的游戏代码后,点击“运行”按钮就会弹出“贪吃蛇”的游戏页面。现在,我们点击Pyhint编辑器的“另存为”按钮,把“贪吃蛇”的游戏代码另存为“snakegame.py”文件,Pyhint编辑器会自动把“snakegame.py”文件保存在“Pyhint\Learn-Python\test”文件夹内。

现在,暂时退出360等杀毒软件,因为有时候打包完成后,一些杀毒软件会误判打包好的exe文件为病毒,从而导致exe文件无法运行。这是因为杀毒软件在扫描过程中对于一些普通程序的行为没有进行充分的区分而产生误判。退出杀毒软件后,打开Pyhint编辑器,点击“打开终端”按钮,在弹出的黑色cmd终端窗口中输入“Pyinstaller -F -w snakegame.py”后按Enter回车键开始打包。耐心等待一会儿,直到提示“completed successfully”打包成功。如图:

打包成功后,在“Pyhint\Learn-Python\test”文件夹内生成了build和dist两个文件夹,以及一个snakegame.spec文件。build文件夹和snakegame.spec文件是Pyinstaller执行过程的中间文件,可以删掉。打开dist文件夹,就可以看到已打包完成的exe软件“snakegame.exe”,这就是使用PyInstaller模块打包生成的exe程序,如图:

这个时候一定要暂时退出360等杀毒软件,因为任何一个简单exe程序软件没有添加到杀毒软件的白名单中,都会被产生误判。最后鼠标双击snakegame.exe运行软件,就可以弹出游戏页面,如图:

现在这个exe可执行文件可以移动到任意一个文件夹内,也可以直接发给别人,在任意一台电脑上运行游戏,完全不依赖Python环境。