将python文件(.py)打包为可执行文件(.exe)的多种方法,看这一篇就够了,万字教学,全网最全!!!

前言

将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

命令:

  1. pyinstaller --add-data="datafile.txt;data" test.py # Windows
  2. pyinstaller --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环境的计算机上直接运行,并且会显示自定义的图标。


注意事项:

  1. 在打包过程中,如果路径或文件名包含中文,可能会导致报错。因此,建议路径和文件名使用英文。
  2. 如果打包的Python脚本使用了第三方库或模块,PyInstaller会尝试将这些依赖项一起打包。但是,有时可能需要手动指定某些隐藏导入的模块。
  3. 在使用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模块,并在目标平台上进行测试以确保可执行文件能够正常运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盲敲代码的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值