文章目录
前言
将Python文件(.py)打包为可执行文件(.exe)有多种方法,每种方法对应python中不同的库,常用的有4种库:pyinstaller、cx_Freeze、Py2exe、Nuitka
,它们都有各自的特点和限制,我们可根据需求选择合适的方法。
1、PyInstaller库的使用(最简单,常用)
PyInstaller是一个流行的工具,用于将Python程序打包成独立的可执行文件(.exe文件)。以下是如何使用PyInstaller将.py文件打包为.exe文件的详细说明和案例,以及该方法中常用参数的使用介绍。
1.1 安装PyInstaller
命令:
pip install pyinstaller
1.2 常用参数及使用
案例1:直接打包
命令:
pyinstaller py文件
;如:pyinstaller test.py
直接在电脑上打开cmd命令窗口,输入命令后,会生成一个dist目录,其中包含可执行文件和一些依赖文件。默认情况下,可执行文件的名称与脚本名称相同。
案例2:打包为单独的可执行文件(-F)
命令:
pyinstaller -F test.py
将所有文件打包成一个单独的可执行文件。默认情况下,PyInstaller会生成一个包含可执行文件和相关依赖文件的文件夹。使用此选项后,所有文件会被打包成一个文件。
案例3:关闭命令行窗口(-w)
命令:
pyinstaller -w test.py
在Windows上,默认的Python程序会有一个命令行窗口。如果程序是GUI程序,使用这个选项可以避免显示命令行窗口。常用于PyQt或Tkinter等图形界面程序,注意
:当对TK程序代码进行打包时,若不添加该选项,打包后的程序很可能无法执行。
案例4:设置可执行文件的图标(-i)
pyinstaller -i 图标.ico test.py
设置可执行文件的图标。可以提供一个.ico格式的图标文件。这个选项通常用于自定义应用程序的外观。
1.3 其它参数(了解)
1、–name
命令:
pyinstaller --name myapp test.py
指定生成的可执行文件的名称。
2、–add-data
命令:
pyinstaller --add-data="datafile.txt;data" test.py
# Windowspyinstaller --add-data="datafile.txt:data" test.py
# Linux/macOS
将外部文件或文件夹添加到打包的可执行文件中。SRC是源文件路径,DEST是目标路径。多个文件时可以多次使用此选项。在Windows上,SRC;DEST用分号(;)分隔;在Linux和macOS上,使用冒号(:)分隔。
3、–hidden-import
命令:
pyinstaller --hidden-import=my_module test.py
用来指定PyInstaller在分析程序时自动忽略的模块。通常,如果代码动态导入模块,PyInstaller可能无法自动检测到这些模块,需要显式地添加。
4、–clean
命令:
pyinstaller --clean test.py
清除上次构建过程中的临时文件,确保从头开始构建。此选项有助于解决一些缓存问题,尤其是在修改代码后打包时。
5、–distpath
命令:
pyinstaller --distpath=output test.py
指定生成的可执行文件所在的目录。默认情况下,PyInstaller会在当前目录下创建一个dist文件夹。
6、–workpath
命令:
pyinstaller --workpath=build test.py
指定PyInstaller工作目录的位置。默认情况下,它会生成一个build文件夹用于存放中间文件。
7、–specpath
命令:
pyinstaller --specpath=specs test.py
用来指定.spec文件的存放目录。.spec文件包含了打包过程的配置信息,通常可以修改.spec文件来定制PyInstaller的行为。
8、–no-upx
命令:
pyinstaller --no-upx test.py
禁用UPX压缩。UPX(Ultimate Packer for eXecutables)是一种可执行文件压缩工具,PyInstaller默认使用它来压缩可执行文件。如果在某些系统上遇到兼容性问题,可以禁用UPX压缩。
9、–debug
命令:
pyinstaller --debug test.py
开启调试模式,这可以帮助在打包后的应用程序中看到更多的调试信息,常用于排查问题。
10、–strip
命令:
pyinstaller --strip test.py
删除不必要的调试符号,减小可执行文件大小。
1.4 案例演示
假设有一个名为test.py的Python脚本,想要将其打包成一个不带控制台窗口的、带有自定义图标的可执行文件。可以使用以下命令:
pyinstaller -F -w -i 图标.ico test.py
执行完毕后,会在dist文件夹中找到一个名为test.exe的可执行文件。这个文件可以在没有Python环境的计算机上直接运行,并且会显示自定义的图标。
注意事项:
- 在打包过程中,如果路径或文件名包含中文,可能会导致报错。因此,建议路径和文件名使用英文。
- 如果打包的Python脚本使用了第三方库或模块,PyInstaller会尝试将这些依赖项一起打包。但是,有时可能需要手动指定某些隐藏导入的模块。
- 在使用PyInstaller打包时,如果遇到兼容性问题或错误提示,可以尝试更新PyInstaller到最新版本或查看官方文档以获取更多帮助。
2、cx_Freeze库的使用
cx_Freeze 是另一个用于将Python脚本打包成可执行文件的工具。它支持跨平台,并且能够将Python代码和依赖的库文件一起打包。cx_Freeze 需要编写一个 setup.py 文件来配置打包过程。
2.1 安装cx_Freeze
命令:
pip install cx_Freeze
2.2 创建打包脚本
cx_Freeze 需要一个打包脚本来配置打包过程。通常,这个脚本是一个 Python 文件,比如 setup.py。
创建一个setup.py文件
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:23
Project: cx_Freeze打包
"""
from cx_Freeze import setup, Executable
# 1、基础配置(可不进行配置)
build_exe_options = {
"packages": ['os'], # 需要包含的额外包
"excludes": ['tkinter'], # 需要排除的包
"include_files": [], # 需要包含的额外文件或文件夹
"optimize": 2, # 优化级别,0(不优化),1(简单优化), 2(最大优化)
}
# 2、创建可执行文件的配置
executables = [
Executable(
script="hello.py", # 需要打包的.py文件
base= None, # 控制台应用程序使用 None,GUI应用程序使用 'Win32GUI'
icon="窗口图标.ico", # 可执行文件的图标
target_name="MyApp.exe", # 生成的可执行文件名称
)
]
# 3、调用 setup 函数
setup(
name="MyApp", # 应用程序名称
version="1.0", # 应用程序版本
description="My Application", # 应用程序描述
options={"build_exe": build_exe_options}, # 构建选项,若没有配置,可不写
executables=executables, # 可执行文件配置
)
2.3 运行打包文件
1、打包为.exe可执行程序
在cmd命令行窗口输入以下命令,生成
.exe
程序:
- 命令:
python setup.py build
setup.py,就是上面创建的打包文件
执行命令后,代码中指定的hello.py
文件就会被打包为一个可执行文件,存放在一个build目录下
2、打包为一个.msi安装包
如果你想生成一个安装包(如 .msi 文件),可以在cmd命令行窗口使用以下命令:
- 命令:
python setup.py bdist_msi
执行命令后,会生成两个目录,build目录下依然存放着可执行文件,dist目录下则存放着一个.msi安装包
2.4 参数说明
1、build_exe_options 参数
-
packages
: 需要包含的额外 Python 包。例如,如果你的脚本使用了 os 模块,你需要在这里指定 “os”。 -
excludes
: 需要排除的 Python 包。例如,如果你不需要 tkinter,可以在这里排除它。 -
include_files
: 需要包含的额外文件或文件夹。例如,如果你的应用程序需要一些数据文件或配置文件,可以在这里指定。 -
optimize
: 优化级别,0 表示不优化,1表示简单优化,2 表示最大优化。
2、Executable 参数
-
script
: 要打包的.py文件的路径。 -
base
: 可执行文件的基础类型。None 用于控制台应用程序,“Win32GUI” 用于 GUI 应用程序,使用该选项后,就不会显示控制台窗口 -
icon
: 可执行文件的图标文件路径(.ico 格式)。 -
target_name
: 生成的可执行文件名称。
3、setup 参数
-
name
: 应用程序名称。 -
version
: 应用程序版本。 -
description
: 应用程序描述。 -
options
: 构建选项,通常包含 build_exe_options 配置。 -
executables
: 可执行文件配置列表。
2.5 案例演示
假设你有一个名为 main.py 的 Python 脚本,并且你想将它打包为一个名为 MyApp.exe 的可执行文件,图标为 icon.ico,并且需要包含一个名为 data/ 的文件夹。
main.py 文件内容
import os
def main():
print("Hello, World!")
print("Current directory:", os.getcwd())
if __name__ == "__main__":
main()
input() # 控制台程序,最好在最后加上一个输入来暂停程序,否则当点击打包后的可执行文件时,控制台窗口会立即关闭,无法显示打印内容
setup.py 文件内容
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:22
Project: cx_Freeze打包
"""
from cx_Freeze import setup, Executable
# 1、基础配置
build_exe_options = {
"packages": ["os"], # 包含的额外包
"excludes": ["tkinter"], # 排除的包
"include_files": ["data/"], # 包含的额外文件或文件夹
"optimize": 2, # 优化级别
}
# 2、创建可执行文件的配置
executables = [
Executable(
script="main.py", # 要打包的文件
base="Win32GUI", # 运行可执行文件时,不显示控制台,若需要显示控制台窗口,则改为 None
icon="icon.ico", # 指定可执行文件图标
target_name="MyApp.exe", # 可执行文件名称
)
]
# 3、调用 setup 函数
setup(
name="MyApp", # 程序名称
version="1.0", # 程序版本
description="My Application", # 程序描述
options={"build_exe": build_exe_options}, # # 构建选项
executables=executables, # # 可执行文件配置
)
运行打包命令:
python setup.py build
执行命令后,会在build目录下生成可执行文件
总结:
通过 cx_Freeze,你可以轻松地将 Python 脚本打包为 Windows 可执行文件。通过配置 setup.py 文件,你可以自定义打包过程,包括包含额外的文件、排除不必要的包、设置图标等。
3、py2exe库的使用
Py2exe 是一个专门用于将Python脚本打包成Windows平台可执行文件的工具。然而,需要注意的是,Py2exe 已经停止维护,可能无法支持最新的Python版本或某些依赖项。因此,在使用前请确保兼容性。
3.1 安装py2exe
命令:
pip install py2exe
3.2 创建打包脚本
py2exe 需要一个打包脚本来配置打包过程。通常,这个脚本是一个 Python 文件,比如 setup.py。
示例 setup.py 文件
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:23
Project: py2exe打包
"""
from distutils.core import setup
import py2exe
# 配置选项
setup(
name="MyApp", # 应用程序名称
version="1.0", # 应用程序版本
description="My Application", # 应用程序描述
# windows=[{"script": "hello.py"}], # 用于 GUI 应用程序,hello.py 代表要打包的文件
console=[{"script": "hello.py"}], # 用于控制台应用程序,hello.py 代表要打包的文件
options={
"py2exe": {
"packages": ["os"], # 需要包含的额外包
"excludes": ["tkinter"], # 需要排除的包
"bundle_files": 1, # 打包方式
"compressed": True, # 是否压缩
"optimize": 2, # 优化级别
"includes": [], # 需要包含的模块
"dll_excludes": ["msvcp90.dll"], # 需要排除的 DLL 文件
}
},
zipfile=None, # 将所有依赖打包到可执行文件中
)
3.3 运行打包文件
在cmd命令行窗口·,输入:
- 命令:
python setup.py py2exe
执行命令后会在 dist 目录下生成可执行文件。
注意:
在执行命令前,确保目录下只有 打包文件setup.py
和 脚本文件hello.py
,若有其他.py文件,在打包时会出现错误,导致无法打包,若存在其它子目录,在执行命令后,会被打包进 build 目录下
3.4 参数说明
1、setup 参数
-
name
: 应用程序名称。 -
version
: 应用程序版本。 -
description
: 应用程序描述。 -
windows
: 用于 GUI 应用程序。值为一个字典列表,每个字典包含以下键:
1、script: 要打包的文件路径。
2、icon_resources: 可执行文件的图标(.ico 格式)。
3、dest_base: 生成的可执行文件名称。 -
console
: 用于控制台应用程序。配置方式与 windows 相同。 -
options
: 打包选项,通常包含 py2exe 配置。
2、py2exe 参数
-
packages
: 需要包含的额外 Python 包。例如,如果你的脚本使用了 os 模块,你需要在这里指定 “os”。 -
excludes
: 需要排除的 Python 包。例如,如果你不需要 tkinter,可以在这里排除它。 -
bundle_files
: 打包方式:
1: 将所有依赖打包到可执行文件中。
2: 将依赖打包为一个单独的库文件。
3: 不打包依赖,依赖文件单独存放。 -
compressed
: 是否压缩打包文件。True 表示压缩。 -
optimize
: 优化级别,0 表示不优化,2 表示最大优化。 -
includes
: 需要包含的额外模块。 -
dll_excludes
: 需要排除的 DLL 文件。
3、zipfile 参数
-
None
: 将所有依赖打包到可执行文件中。 -
"library.zip"
: 将依赖打包为一个单独的 library.zip 文件。
3.5 案例演示
案例1:打包控制台应用程序
假设你有一个名为 main.py 的 Python 脚本,并且你想将它打包为一个控制台应用程序。
main.py 文件内容
import os
def main():
print("Hello, World!")
print("Current directory:", os.getcwd())
if __name__ == "__main__":
main()
input() # 控制台程序,最好在最后加上一个输入来暂停程序,否则当点击打包后的可执行文件时,控制台窗口会立即关闭,无法显示打印内容
setup.py 文件内容
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:23
Project: py2exe打包
"""
from distutils.core import setup
import py2exe
setup(
name="MyApp",
version="1.0",
description="My Console Application",
console=[{"script": "main.py"}], # 控制台应用程序
options={
"py2exe": {
"packages": ["os"],
"excludes": ["tkinter"],
"bundle_files": 1,
"compressed": True,
"optimize": 2,
}
},
zipfile=None,
)
运行打包命令
python setup.py py2exe
执行后,dist 目录下会生成 main.exe 文件。
案例2:打包 GUI 应用程序
假设你有一个名为 main.py 的 Python 脚本,并且你想将它打包为一个 GUI 应用程序,图标为 icon.ico。
main.py 文件内容
import tkinter as tk
def main():
root = tk.Tk()
root.title("MyApp")
label = tk.Label(root, text="Hello, World!")
label.pack()
root.mainloop()
if __name__ == "__main__":
main()
setup.py 文件内容
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:23
Project: py2exe打包
"""
from distutils.core import setup
import py2exe
# 配置选项
setup(
name="MyApp", # 应用程序名称
version="1.0", # 应用程序版本
description="My Application", # 应用程序描述
# GUI程序打包
windows=[{
"script": "main.py", # 要打包的文件
"icon_resources": [(1, "icon.ico")], # 设置图标
"dest_base": "MyApp", # 生成的可执行文件名称
}],
options={
"py2exe": {
"packages": ["tkinter"], # 需要包含的额外包
"bundle_files": 1, # 打包方式
"compressed": True, # 是否压缩
"optimize": 2, # 优化级别
}
},
zipfile=None, # 将所有依赖打包到可执行文件中
)
运行打包命令:
python setup.py py2exe
执行后,dist 目录下会生成 MyApp.exe 文件,并带有指定的图标。
3.6 常见问题
问题 1:缺少 DLL 文件
如果打包后运行时提示缺少 DLL 文件,可以在 dll_excludes 中排除不必要的 DLL 文件,或者手动将缺失的 DLL 文件复制到 dist 目录。
问题 2:打包文件过大
可以通过以下方式减小打包文件大小:
- 设置 compressed=True。
- 设置 optimize=2。
- 排除不必要的包和模块。
总结:
通过 py2exe,你可以轻松地将 Python 脚本打包为 Windows 可执行文件。通过配置 setup.py 文件,你可以自定义打包过程,包括包含额外的包、排除不必要的模块、设置图标等。
4、Nuitka库的使用
Nuitka 是一个将 Python 脚本编译为 C 代码并生成高效可执行文件(.exe)的工具。它支持跨平台编译,并且生成的二进制文件性能优于传统的打包工具。以下是详细的使用说明和案例,包括每种参数的使用方法。
4.1 安装 Nuitka
命令:
pip install nuitka
4.2 基本使用
方法1:在cmd命令行窗口执行命令
命令:
nuitka --standalone --onefile --windows-disable-console --output-dir=dist main.py
参数说明:
-
--standalone
: 将脚本及其依赖打包为一个独立的文件夹。 -
--onefile
: 将所有文件打包为一个单独的可执行文件。 -
--windows-disable-console
: 用于 GUI 应用程序,禁用控制台窗口,默认为不禁用 -
--output-dir=dist
: 指定输出目录为 dist。 -
main.py
: 要打包的 Python 脚本。
方法2:创建打包脚本
可以创建一个打包脚本(如 build.py)来自动化打包过程。
示例 build.py 文件
# -*- coding: utf-8 -*-
"""
Author: @CSDN盲敲代码的阿豪
Time: 2025/1/14 13:22
Project: Nuitka打包
"""
import os
import subprocess
# 打包配置
script = "main.py" # 主脚本文件
output_dir = "dist" # 输出目录
icon = "icon.ico" # 可执行文件的图标
disable_console = True # 是否禁用控制台窗口
# 构建命令
command = [
"nuitka",
"--standalone",
"--onefile",
f"--output-dir={output_dir}",
f"--windows-icon={icon}",
]
# 确定是否禁用控制台窗口
if disable_console:
command.append("--windows-disable-console")
command.append(script)
# 运行打包命令
subprocess.run(command)
运行上面的代码,即可对目标脚本进行打包
4.3 参数说明
1、常用参数
-
--standalone
: 将脚本及其依赖打包为一个独立的文件夹。适合分发应用程序。 -
--onefile
: 将所有文件打包为一个单独的可执行文件。适合简单的应用程序。 -
--windows-disable-console
: 用于 GUI 应用程序,禁用控制台窗口。 -
--output-dir=<dir>
: 指定输出目录。 -
--windows-icon=<icon>
: 指定可执行文件的图标(.ico 格式)。 -
--follow-imports
: 包含所有导入的模块(默认启用)。 -
--include-package=<package>
: 包含指定的 Python 包。 -
--include-module=<module>
: 包含指定的 Python 模块。 -
--plugin-enable=<plugin>
: 启用插件(如 tk-inter、numpy 等)。 -
--enable-plugin=<plugin>
: 同 --plugin-enable。 -
--disable-console
: 禁用控制台窗口(Windows 专用)。 -
--remove-output
: 在打包完成后删除临时文件。 -
--show-progress
: 显示打包进度。 -
--show-memory
: 显示内存使用情况。 -
--jobs=<N>
: 使用多线程编译(N 是线程数)。
2、高级参数
-
--lto
: 启用链接时优化(Link Time Optimization)。 -
--clang
: 使用 Clang 编译器(如果已安装)。 -
--mingw64
: 使用 MinGW64 编译器(Windows 专用)。 -
--msvc=<version>
: 使用指定版本的 MSVC 编译器(Windows 专用)。 -
--python-flag=<flag>
: 传递 Python 编译标志(如 -O 用于优化)。
4.4 案例演示
案例 1:打包控制台应用程序
假设你有一个名为 main.py 的 Python 脚本,并且你想将它打包为一个控制台应用程序。
main.py 文件内容
def main():
print("Hello, World!")
if __name__ == "__main__":
main()
input() # 控制台程序,最好在最后加上一个输入来暂停程序,否则当点击打包后的可执行文件时,控制台窗口会立即关闭,无法显示打印内容
运行打包命令
nuitka --standalone --onefile --output-dir=dist main.py
执行后,dist 目录下会生成 main.exe 文件。
案例 2:打包 GUI 应用程序
假设你有一个名为 main.py 的 Python 脚本,并且你想将它打包为一个 GUI 应用程序,图标为 icon.ico。
main.py 文件内容
import tkinter as tk
def main():
root = tk.Tk()
root.title("MyApp")
label = tk.Label(root, text="Hello, World!")
label.pack()
root.mainloop()
if __name__ == "__main__":
main()
运行打包命令
nuitka --standalone --onefile --windows-disable-console --windows-icon=icon.ico --output-dir=dist main.py
执行后,dist 目录下会生成 main.exe 文件,并带有指定的图标。
案例 3:包含额外模块和插件
假设你的脚本使用了 numpy 和 tkinter,并且你想启用相关插件。
打包命令
nuitka --standalone --onefile --plugin-enable=numpy --plugin-enable=tk-inter --output-dir=dist main.py
4.5 常见问题
问题 1:缺少依赖
如果打包后运行时提示缺少依赖,可以尝试以下方法:
- 使用 --include-package 或 --include-module 显式包含缺失的模块。
- 手动将缺失的依赖文件复制到输出目录。
问题 2:打包文件过大
可以通过以下方式减小打包文件大小:
- 使用 --lto 启用链接时优化。
- 使用 --remove-output 删除临时文件。
- 排除不必要的模块和插件。
问题 3:编译速度慢
可以通过以下方式加快编译速度:
- 使用 --jobs= 启用多线程编译。
- 使用 --clang 或 --mingw64 选择更快的编译器。
总结:
Nuitka 是一个强大的工具,可以将 Python 脚本编译为高效的可执行文件。通过合理使用参数,你可以自定义打包过程,包括包含额外的模块、启用插件、设置图标等。生成的二进制文件性能优越,适合分发和部署。
5、方法总结
以上是将Python文件打包为可执行文件的四种常用方法及其使用案例和详细说明。不同的方法具有不同的特点和限制,用户可以根据实际需求选择合适的工具。在打包之前,请确保已经安装了所有依赖的Python模块,并在目标平台上进行测试以确保可执行文件能够正常运行。