匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python开发桌面应用程序:PyInstaller实践

Python开发桌面应用程序:PyInstaller实践

随着Python的普及和应用范围的不断扩大,越来越多的开发者开始使用Python来开发桌面应用程序。然而,Python本身并没有提供一个方便快捷的方式来将Python程序打包成一个独立的可执行文件,这就需要使用第三方工具来完成这一任务。本文将详细介绍如何使用PyInstaller来将Python程序打包成一个独立的可执行文件。

一、什么是PyInstaller?

PyInstaller是一个将Python应用程序打包成独立可执行文件(exe)的工具。通过PyInstaller,开发者可以将Python程序以及所依赖的库和资源文件打包成一个独立的可执行文件,方便快捷地在不同的机器上进行部署和运行。

PyInstaller的主要特点包括:

- 支持多平台:PyInstaller可以在Windows、Linux和Mac OS X等多个平台上运行,可以将Python程序打包成对应平台的可执行文件。
- 兼容性好:PyInstaller支持大多数Python版本,包括Python 2.7和Python 3.x,并且能够自动检测Python程序所依赖的库和资源文件。
- 可自定义选项:PyInstaller提供了众多的选项和参数,开发者可以根据自己的需求进行自定义配置。

二、安装PyInstaller

在使用PyInstaller之前,首先需要安装PyInstaller。在Windows平台上,可以通过pip命令进行安装:

```
pip install pyinstaller
```

在Linux平台上,可以通过apt-get命令进行安装:

```
sudo apt-get install pyinstaller
```

在Mac OS X平台上,可以通过Homebrew来安装PyInstaller:

```
brew install pyinstaller
```

安装完成后,可以通过以下命令来检查PyInstaller是否安装成功:

```
pyinstaller --version
```

如果输出类似于“3.6”或者“4.0.dev0+2c686c96”等版本号信息,则表示PyInstaller已经成功安装。

三、打包Python程序

下面将以一个简单的Python程序作为例子,介绍如何使用PyInstaller打包Python程序。

1. 编写Python程序

首先,我们需要编写一个Python程序,作为打包的示例。在这里,我们编写了一个简单的GUI程序,使用了Python的tkinter库来实现GUI界面。程序代码如下:

```
# gui.py

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()
```

这是一个简单的GUI程序,它包含一个按钮和一个文本框。点击按钮后,会在控制台输出一条问候语。

2. 打包Python程序

接下来,我们可以使用PyInstaller将这个Python程序打包成一个可执行文件。在命令行中,切换到Python程序所在的目录,然后执行以下命令:

```
pyinstaller gui.py
```

执行该命令后,PyInstaller会自动检测Python程序所依赖的库和资源文件,并将其打包到一个独立的目录下。在命令行中,可以看到PyInstaller的打包过程:

```
$ pyinstaller gui.py
121 INFO: PyInstaller: 3.5
121 INFO: Python: 3.7.1
121 INFO: Platform: Windows-10-10.0.18362-SP0
123 INFO: wrote C:\Users\User\Desktop\dist\gui.spec
128 INFO: UPX is not available.
132 INFO: Extending PYTHONPATH with paths
['C:\\Users\\User\\Desktop',
 'C:\\Users\\User\\Desktop',
 'C:\\Users\\User\\Desktop',
 'C:\\Users\\User\\Desktop']
132 INFO: checking Analysis
132 INFO: Building Analysis because Analysis-00.toc is non existent
132 INFO: Initializing module dependency graph...
...
...
3906 INFO: checking Tree
3906 INFO: Building Tree because Tree-00.toc is non existent
3906 INFO: Building Tree tree-00.toc
3931 INFO: checking Tree
3931 INFO: Building Tree because Tree-01.toc is non existent
3931 INFO: Building Tree tree-01.toc
3937 INFO: Removing unreachable paths
3937 INFO: Building freeze1 because freeze1-00.toc is non existent
3937 INFO: Initializing module dependency graph...
3939 INFO: Initializing module graph optimizer...
3953 INFO: Processing pre-find module path hook   distutils
3956 INFO: distutils: retargeting to non-venv dir 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python37-32\\lib'
4146 INFO: Caching module dependency graph...
4162 INFO: running Analysis
4174 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by c:\users\user\appdata\local\programs\python\python37-32\python.exe
4231 INFO: Analyzing C:\Users\User\Desktop\gui.py
4273 INFO: Processing pre-safe import module hook   urllib3.packages.six.moves
...
...
6351 INFO: Building PKG-00.pkg
6351 INFO: Building PKG-01.pkg
6352 INFO: Building PKG-02.pkg
6352 INFO: Building PKG-03.pkg
6372 INFO: Building PKG-04.pkg
6372 INFO: Building PKG-05.pkg
6386 INFO: Building PKG-06.pkg
6386 INFO: Building PKG-07.pkg
6399 INFO: Building PKG-08.pkg
6399 INFO: Building PKG-09.pkg
6411 INFO: Building PKG-10.pkg
6412 INFO: Building PKG-11.pkg
6424 INFO: Building PKG-12.pkg
6424 INFO: Building PKG-13.pkg
6445 INFO: Building PKG-14.pkg
6445 INFO: Building PKG-15.pkg
6456 INFO: Building PKG-16.pkg
6456 INFO: Building PKG-17.pkg
6469 INFO: Building PKG-18.pkg
6469 INFO: Building PKG-19.pkg
6481 INFO: Building PKG-20.pkg
6481 INFO: Building PKG-21.pkg
6494 INFO: Building PKG-22.pkg
6494 INFO: Building PKG-23.pkg
6497 INFO: Building PKG-24.pkg
6500 INFO: Building PKG-25.pkg
6500 INFO: Building PKG-26.pkg
6500 INFO: Building PKG-27.pkg
6500 INFO: Building PKG-28.pkg
6500 INFO: Building PKG-29.pkg
6500 INFO: Building PKG-30.pkg
6500 INFO: Building PKG-31.pkg
6500 INFO: Building PKG-32.pkg
6500 INFO: Building PKG-33.pkg
6500 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
6500 INFO: Writing RT_ICON 1 resource with 10952 bytes
6500 INFO: Writing RT_ICON 2 resource with 3752 bytes
6500 INFO: Writing RT_ICON 3 resource with 2216 bytes
6500 INFO: Writing RT_ICON 4 resource with 1384 bytes
6500 INFO: Writing RT_ICON 5 resource with 37000 bytes
6500 INFO: Writing RT_ICON 6 resource with 9640 bytes
6500 INFO: Writing RT_ICON 7 resource with 4264 bytes
6500 INFO: Writing RT_ICON 8 resource with 1128 bytes
6500 INFO: Writing RT_ICON 9 resource with 37000 bytes
6500 INFO: Writing RT_ICON 10 resource with 9640 bytes
6500 INFO: Writing RT_ICON 11 resource with 4264 bytes
6500 INFO: Writing RT_ICON 12 resource with 1128 bytes
6500 INFO: Writing RT_ICON 14 resource with 5632 bytes
6500 INFO: Writing RT_ICON 15 resource with 4264 bytes
6500 INFO: Writing RT_ICON 16 resource with 1128 bytes
6500 INFO: Writing RT_ICON 17 resource with 37000 bytes
6500 INFO: Writing RT_ICON 18 resource with 9640 bytes
6500 INFO: Writing RT_ICON 19 resource with 4264 bytes
6500 INFO: Writing RT_ICON 20 resource with 1128 bytes
6500 INFO: Writing RT_ICON 21 resource with 37000 bytes
6500 INFO: Writing RT_ICON 22 resource with 9640 bytes
6500 INFO: Writing RT_ICON 23 resource with 4264 bytes
6500 INFO: Writing RT_ICON 24 resource with 1128 bytes
6500 INFO: Writing RT_ICON 25 resource with 1056 bytes
6500 INFO: Writing RT_ICON 26 resource with 1472 bytes
6500 INFO: Writing C:\Users\User\Desktop\dist\gui.exe.manifest
6500 INFO: Updating manifest in C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PyInstaller\templates\basic\numpy.dll.manifest
6500 INFO: Updating resource type 24 name 1 language 0
6528 INFO: Appending archive to EXE C:\Users\User\Desktop\dist\gui.exe
6538 INFO: Building EXE from out00-EXE.toc completed successfully.
```

在PyInstaller的打包过程中,可以看到它会生成一个新的目录,名为“dist”,其中包含了可执行文件(gui.exe)以及所依赖的库和资源文件等。

四、总结

本文介绍了如何使用PyInstaller将Python程序打包成一个独立的可执行文件。通过PyInstaller,开发者可以方便快捷地将Python程序部署到不同的机器上。当然,PyInstaller并不是唯一的打包工具,还有其他的工具如cx_Freeze、py2exe等,开发者可以根据自己的需求选择合适的工具进行打包。