Nuitka 打包 exe 软件步骤

admin2024-08-23  5

一、Nuitka 的特点

Nuitka 是一个强大的 Python 编译器,它将 Python 代码编译成 C 代码,然后使用标准的 C 编译器(如 GCC、Clang 或 MSVC)生成可执行文件。Nuitka 的主要目标是实现完整的 Python 兼容性,同时提供显著的性能提升和更小的文件体积。以下是 Nuitka 的一些关键特点,以及与 PyInstaller 的区别。

1. Nuitka 的主要特点
  • 性能提升:Nuitka 通过将 Python 代码编译为 C 代码,进而编译为本地机器代码,提升了 Python 程序的运行速度。特别是对于计算密集型任务,Nuitka 能带来显著的性能改进。

  • 完整的 Python 兼容性:Nuitka 完全支持 Python 2 和 Python 3 的所有语言特性,包括复杂的元类和生成器表达式等。它能运行几乎所有的 Python 程序,并且在性能上有所改进。

  • 生成独立的可执行文件:Nuitka 可以生成无需 Python 运行时环境的独立可执行文件(Standalone 模式)。这对于不想让用户安装 Python 环境的应用非常有用。

  • 与 C 编译器集成:Nuitka 将 Python 转换为 C 代码,并使用系统的 C 编译器(如 GCC、MSVC、Clang)来生成高效的可执行文件。因此,Nuitka 生成的文件在性能和兼容性上都有显著优势。

  • 细粒度的优化:Nuitka 对代码进行了一些低级优化,包括删除未使用的代码、函数内联和数据结构优化。这些优化有助于减少代码大小并提升运行效率。

  • 支持多线程:Nuitka 可以更好地利用多核 CPU 来进行编译,提高了编译速度,特别是对于大型项目。

2. Nuitka 与 PyInstaller 的区别
  • 性能:Nuitka 的核心优势在于它将 Python 代码编译为本地 C 代码,从而提高了性能。而 PyInstaller 只是将 Python 代码打包成一个包含解释器和依赖项的可执行文件,并不会带来运行时的性能提升。

  • 文件大小:Nuitka 编译的可执行文件通常比 PyInstaller 打包的文件要小,尤其是在启用 UPX 压缩的情况下。PyInstaller 打包的文件往往较大,因为它包含了完整的 Python 运行时环境。

  • 兼容性:Nuitka 提供了对 Python 语言的完整支持,确保所有语言特性都可以正常运行。而 PyInstaller 则主要依赖于现有的 Python 解释器,可能会遇到某些复杂代码无法正确打包的情况。

  • 依赖处理:PyInstaller 的依赖项检测机制比较强大,适合处理复杂的依赖树,但它生成的可执行文件包含了整个 Python 解释器。Nuitka 则通过生成更为精简的独立文件来管理依赖。

  • 编译时间:由于 Nuitka 涉及到 C 编译器的使用,编译时间通常比 PyInstaller 更长,尤其是对于大型项目。这是性能提升带来的一个代价。

  • 跨平台支持:PyInstaller 支持更广泛的操作系统平台(如 Windows、macOS 和 Linux),而 Nuitka 在跨平台上也有良好支持,但通常需要在目标平台上进行编译以确保兼容性。

总结

Nuitka 是一个真正的编译器,它可以将 Python 代码编译为本地机器码,带来性能提升和较小的可执行文件体积。它适合那些需要优化性能的应用程序。而 PyInstaller 则更适合快速打包和部署 Python 应用程序,但不会带来性能上的改进。

通过选择 Nuitka 或 PyInstaller,开发者可以根据应用场景的需要,在性能优化和打包速度之间进行权衡。

二、Nuitka 基本选项(参数)介绍

Nuitka 提供了丰富的选项和参数,允许开发者控制编译过程的各个方面。以下是 Nuitka 的一些常用基本选项介绍,涵盖了从编译模式、优化到输出控制等多个方面。

1. 编译模式
  • --standalone:生成一个独立的可执行文件,包含所有需要的依赖项。生成的文件可以在没有 Python 运行环境的机器上运行。

    • 示例:nuitka --standalone main.py
  • --onefile:将所有内容(包括依赖项和 Python 解释器)打包到一个单独的可执行文件中,适合分发和部署。

    • 示例:nuitka --onefile main.py
  • --module:将 Python 源代码编译为一个可重用的动态库,而不是一个独立的可执行文件。适用于将 Python 模块打包成扩展模块。

    • 示例:nuitka --module mymodule.py
  • --run:编译并立即运行 Python 脚本。适用于测试代码的执行效果。

    • 示例:nuitka --run main.py
2. 优化选项
  • --lto:启用链接时优化(Link Time Optimization)。该选项可以进一步优化编译结果,使可执行文件的性能提升。

    • 示例:nuitka --lto main.py
  • --plugin-enable=upx:启用 UPX 压缩,压缩生成的可执行文件以减小文件体积。

    • 示例:nuitka --plugin-enable=upx main.py
  • --nofollow-import-to=<module>:防止 Nuitka 跟踪特定模块的导入。可以用来优化编译时间并排除不必要的模块。

    • 示例:nuitka --nofollow-import-to=tkinter main.py
  • --remove-output:删除之前生成的输出文件,确保编译时不会使用旧的缓存或输出。

    • 示例:nuitka --remove-output main.py
3. 控制台和窗口化选项
  • --windows-disable-console--windows-console-mode=disable:禁用控制台窗口(用于 GUI 程序),使程序运行时不显示命令行窗口。

    • 示例:nuitka --windows-disable-console main.py
  • --windows-icon-from-ico=<path>:指定图标文件路径,为生成的可执行文件添加自定义图标。

    • 示例:nuitka --windows-icon-from-ico="icon.ico" main.py
4. 输出控制选项
  • --output-dir=<dir>:指定输出目录,编译生成的文件将被放置在该目录中。方便将编译结果分类存放。

    • 示例:nuitka --output-dir=out main.py
  • --show-progress:在编译过程中显示详细的进度信息。这对于调试和了解编译过程非常有帮助。

    • 示例:nuitka --show-progress main.py
  • --no-pyi-file:不生成 .pyi 类型的文件。该文件通常用于类型提示和模块导入时的代码补全。

    • 示例:nuitka --no-pyi-file main.py
5. 并行编译选项
  • --jobs=<N>:设置并行编译的线程数,以利用多核 CPU 提升编译速度。建议根据 CPU 核心数量调整。
    • 示例:nuitka --jobs=4 main.py
6. 编译器选择和配置
  • --mingw64:强制使用 MinGW-w64 编译器进行编译,适用于 Windows 平台,特别是对于没有 MSVC 编译器的环境。

    • 示例:nuitka --mingw64 main.py
  • --msvc:使用 MSVC(Microsoft Visual C++)编译器进行编译,适用于 Windows 平台。

    • 示例:nuitka --msvc main.py
  • --clang:强制使用 Clang 编译器进行编译。适用于支持 Clang 的平台(如 macOS 和 Linux)。

    • 示例:nuitka --clang main.py
7. 插件选项
  • --enable-plugin=<plugin>:启用指定的插件。例如,tk-inter 插件可用于打包 tkinter 应用程序。

    • 示例:nuitka --enable-plugin=tk-inter main.py
  • --plugin-enable=<plugin>:启用已安装的插件。用于启用如 upx 等插件进行功能扩展。

    • 示例:nuitka --plugin-enable=upx main.py
8. 调试和日志选项
  • --debug:启用调试信息输出。这可以帮助跟踪代码执行中的错误或问题。

    • 示例:nuitka --debug main.py
  • --trace-execution:启用执行跟踪日志,可以跟踪代码执行过程中的详细信息,用于调试复杂问题。

    • 示例:nuitka --trace-execution main.py
  • --recompile-c-only:只重新编译 C 代码而不重新编译 Python 部分,用于加快开发过程中的调试周期。

    • 示例:nuitka --recompile-c-only main.py

总结

Nuitka 提供了多种选项来控制 Python 代码的编译过程,涵盖了从优化、压缩、输出控制到并行编译和插件支持的多个方面。通过灵活使用这些参数,开发者可以根据项目需求最大限度地优化生成的可执行文件,无论是提升性能还是减少文件体积。

三、实际指令介绍

在这一部分,我们将详细介绍以下 Nuitka 打包指令的每一个参数和作用,帮助你理解打包过程中发生了什么,以及如何调整它们来适应你的需求。

python -m nuitka --mingw64 --standalone --output-dir=out --show-progress --onefile --plugin-enable=upx --upx-binary="./upx-4.2.4-win64/upx.exe" --jobs=4 --include-module=wx --include-module=wx.xrc --include-module=wx._xml --windows-console-mode=disable --windows-icon-from-ico="dpad.ico" main.py
1. python -m nuitka
  • 这是使用 Python 的 -m 选项来运行 Nuitka 模块。通过 python -m nuitka,你可以确保使用的是当前 Python 环境下安装的 Nuitka,不需要关心系统路径中的命令冲突问题。
2. --mingw64
  • 作用:强制使用 MinGW-w64 编译器,这通常用于 Windows 系统上生成可执行文件。MinGW-w64 是一个开源的 Windows 编译器,支持 32 位和 64 位编译,兼容性较强,适合生成独立的 Windows 可执行文件。
3. --standalone
  • 作用:生成一个完全独立的可执行文件。使用该选项后,Nuitka 会打包 Python 解释器和所有依赖的库,使得生成的可执行文件可以在没有 Python 环境的机器上运行。
4. --output-dir=out
  • 作用:指定编译输出的目录。在此命令中,生成的可执行文件以及相关的文件将被输出到 out 目录中。这使得输出文件可以与源文件分离,便于管理。
5. --show-progress
  • 作用:显示编译过程中每个步骤的详细进度。这对于较大的项目或复杂的编译过程非常有帮助,方便你了解编译的不同阶段,尤其是在调试或优化时。
6. --onefile
  • 作用:将所有依赖项(包括 Python 解释器和所有必要的库)打包成一个单独的可执行文件。这个选项非常适合发布和分发应用程序,因为用户只需一个文件即可运行整个程序。
7. --plugin-enable=upx
  • 作用:启用 UPX 压缩。UPX 是一个用来压缩可执行文件的开源工具,启用该选项可以显著减小生成的可执行文件的大小。UPX 的压缩效果通常对于部署在磁盘空间有限的环境中的程序很有帮助。需要指定--upx-binary=
8. --jobs=4
  • 作用:指定并行编译的线程数。在多核 CPU 上,使用多个线程可以加速编译过程。这个选项设定了 4 个并行编译任务。你可以根据自己的 CPU 核心数量来调整该参数。
9. --include-module=wx --include-module=wx.xrc --include-module=wx._xml
  • 作用:显式地将 wxPython 库及其相关模块(wx.xrcwx._xml)包含在打包过程中。尽管 Nuitka 会自动检测依赖关系并包含模块,但有时动态导入的模块可能无法被自动检测到,因此需要手动显式指定。
10. --windows-console-mode=disable
  • 作用:禁用控制台窗口。如果你的应用程序是一个 GUI 程序,不需要控制台,那么使用这个选项可以避免在运行时弹出不必要的命令行窗口。
11. --windows-icon-from-ico="dpad.ico"
  • 作用:为生成的可执行文件设置图标。你可以使用 .ico 文件为你的程序自定义图标,这对于品牌化和提高程序的视觉吸引力很有帮助。
12. main.py
  • 作用:这是待打包的主 Python 脚本。Nuitka 会将这个脚本作为输入,并将其编译为可执行文件。

总结

这个打包命令综合了多个 Nuitka 的高级选项,从使用 MinGW 编译器到启用 UPX 压缩,再到生成一个无控制台的独立可执行文件。这些选项确保了打包后的文件不仅体积小、性能高,而且在没有 Python 环境的机器上也能正常运行,同时配有自定义图标,非常适合生产环境的应用分发。

四、编译器选择

使用 --mingw64 选项与不使用它的打包过程的主要区别在于编译器的选择和一些具体的特性。以下是详细的区别:

1. 编译器的选择

  • 使用 --mingw64

    • 强制使用 MinGW-w64 编译器。这是一个开源的 Windows 编译器,能够生成原生 Windows 可执行文件,支持 32 位和 64 位应用程序的编译。
    • 优点
      • 兼容性较好,适合大多数 Windows 环境。
      • 开源并且跨平台(但主要用于 Windows 编译)。
      • 对于没有安装 Visual Studio 的系统非常有用,因为它不依赖于 Microsoft 的编译工具链。
  • 不使用 --mingw64

    • Nuitka 将默认选择使用系统上可用的 C 编译器。在 Windows 上,Nuitka 默认会使用 MSVC(Microsoft Visual C++ 编译器)进行编译。如果没有安装 MSVC,它可能会尝试使用现有的 MinGW 编译器(如果存在)。
    • 优点
      • MSVC 是微软官方的编译器,生成的可执行文件在 Windows 上通常会有较高的稳定性和性能。
      • MSVC 可能在某些情况下对 Windows 平台上的优化做得更好,特别是对于大型复杂项目。

2. 优化和性能

  • MSVC 编译器(默认编译器,不使用 --mingw64 时可能被选用):

    • MSVC 是微软的官方编译器,经过专门优化,生成的可执行文件可能在 Windows 平台上运行得更稳定、更快。
    • MSVC 编译器支持 Windows 特定的编译优化,尤其是对于涉及多线程和并行计算的项目,MSVC 通常能带来更好的性能表现。
  • MinGW-w64 编译器(使用 --mingw64 时):

    • MinGW-w64 是一个更通用的编译器,虽然它可以生成 Windows 可执行文件,但在某些情况下它的优化可能不如 MSVC 编译器专注于 Windows 平台的效果。
    • 但对于那些没有安装 Visual Studio 的开发者或用户,MinGW-w64 是一个很好的替代选择。

3. 编译环境

  • 使用 --mingw64

    • 适用于没有安装 Visual Studio 的系统,尤其是开源开发环境。
    • 需要确保 MinGW-w64 编译器已经正确安装并在路径中可用。
  • 不使用 --mingw64

    • 如果你的系统上已经安装了 Visual Studio,那么 Nuitka 将自动选择 MSVC 编译器,无需额外设置。对于已经配置好 MSVC 编译环境的开发者,这通常是最好的选择。

4. 文件大小和兼容性

  • 使用 --mingw64

    • 生成的文件通常比 MSVC 编译的文件稍微大一些,但差异不大。
    • 由于 MinGW-w64 生成的是原生 Windows 可执行文件,兼容性依然很好,尤其适合那些没有 MSVC 的系统。
  • 不使用 --mingw64

    • 如果使用 MSVC 编译器,生成的文件可能会稍微小一点,并且在 Windows 平台上的兼容性和性能可能更好。

总结

  • 使用 --mingw64:推荐用于没有安装 Visual Studio 的环境或者希望使用开源工具链的开发者。这是一个轻量级、跨平台的编译器,适合大多数 Windows 项目。

  • 不使用 --mingw64:如果你的系统上已经配置了 MSVC 编译器,并且希望利用微软官方工具链的优化,那么可以不使用 --mingw64,这样 Nuitka 会自动选择 MSVC 进行编译,通常性能和稳定性会更高。

在实际项目中,选择哪种编译器主要取决于你的开发环境和项目需求。如果没有特殊需求,不使用 --mingw64 并让 Nuitka 自动选择系统编译器通常是更方便的选择。

五、测试结果

  1. 使用UPX效果不明显
  2. 使用–mingw64,输出的软件包确实会稍稍大点,但是只有一点点。(57945K对比56597KB)
  3. 对比指令,不适用upx,不使用–mingw64,不输出详细过程。
python -m nuitka --standalone --output-dir=out1 --onefile --jobs=4 --include-module=wx --include-module=wx.xrc --include-module=wx._xml --windows-console-mode=disable --windows-icon-from-ico="dpad.ico" main.py
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!