Python代码打包为单个可执行文件实现过程

 更新时间:2025年09月25日 09:32:19   作者:Q.V.Q  
文章对比了Nuitka与PyInstaller两种Python打包工具,前者将代码编译为C/C++生成高效执行文件,但打包慢且部分库不兼容;后者可生成单文件且易用,但运行时产生临时文件,均需处理依赖项,PyInstaller支持自定义配置文件,Nuitka可通过插件优化性能

目前最常用的两种方法是使用 NuitkaPyInstaller

  • PyInstaller:这是一个非常流行的工具,可以将Python脚本打包为单个可执行文件,支持Windows、macOS和Linux。它还能够自动检测并包含大多数Python包和库。优点是简单易用,缺点是在运行时会释放一堆临时文件。
  • Nuitka: 是将Python代码编译为C/C++代码的编译器,然后再使用C/C++编译器生成可执行文件。与其他打包工具相比,它能产生性能更优的可执行文件。优点是打包后文件执行效率高,缺点是打包速度慢且某些库不兼容。

PyInstaller

1. 安装

pip install pyinstaller

2. 基本用法

pyinstaller main.py
pyinstaller --onefile main.py
pyinstaller --onefile --name=hello main.py

3. 常用参数

参数说明
--onefile将所有依赖打包成一个单独的可执行文件。没有这个选项时,生成的可执行文件将依赖于多个文件
--windowed打包为 GUI 应用程序,不显示控制台窗口(仅适用于 Windows 和 macOS)
--name指定生成的可执行文件的名称
--icon为生成的可执行文件指定图标文件。图标文件通常为 .ico(Windows)或 .icns(macOS)格式。
--add-data添加额外的数据文件。格式为 source:destination,其中 source 是本地路径,destination 是可执行文件内的路径。
--hidden-import手动指定需要包含的模块。如果某些模块在运行时动态导入,PyInstaller 可能无法自动检测到这些依赖项
--exclude-module手动排除某些模块

示例用法如下:

pyinstaller --onefile \
            --windowed \
            --name=my_program \
            --icon=assets/app_icon.ico \
            --add-data="resources/config.json;resources" \
            --hidden-import=json \
            main.py

4. 配置文件

PyInstaller 在首次运行时会生成一个 .spec 文件,这个文件定义了打包的所有配置。你可以编辑这个文件来自定义打包过程。

在生成的 my_program.spec 文件中,你可以自定义一些高级选项,比如添加额外的数据文件、指定打包目录等。

例如,添加一个额外的数据文件到 datas 列表中:

datas=[('data_folder/*', 'data')]

使用自定义的 .spec 文件进行打包:

pyinstaller my_program.spec

5. 常见问题

pyinstaller 执行后报错通常为以下类似问题,手动导入模块即可解决

# 未正常导入:Crypto.Cipher.PKCS1_v1_5 
ImportError: cannot import name 'PKCS1_v1_5' from 'Crypto.Cipher'

# 未正常导入:Crypto.PublicKey.RSA
ImportError: cannot import name 'RSA' from 'Crypto.PublicKey'

# 未正常导入:boto3
ModuleNotFoundError: No module named 'boto3'

# 未正常导入:tqdm
ModuleNotFoundError: No module named 'tqdm'

Nuitka

1. 安装

pip install nuitka

同时确保安装了 C 编译器,如 gcc(Linux)、clang(macOS)、msvc(Windows)或者 MinGW-w64(Windows)。

在 Windows 上,建议使用 MinGW-w64。

2. 打包命令

nuitka --standalone main.py

# 使用pandas
nuitka --standalone --onefile --plugin-enable=pandas  script.py

# 使用tkinter、numpy
nuitka --standalone --follow-imports --plugin-enable=tk-inter --plugin-enable=numpy example.py

# 打包为单文件
nuitka --standalone --onefile --show-progress  --lto=yes script.py

3. 常用参数

  • --standalone:生成一个包含所有依赖的目录
  • --onefile:将所有内容打包成一个单一的可执行文件,pip install zstandard 可减小大小
  • --follow-imports:自动导入所需模块
  • --plugin-enable:用于启用特定的编译插件,例如:tkinter、PyQt5、Numpy等
  • --show-progress:展示打包进度
  • --windows-icon:指定程序图标
  • --windows-disable-console:去掉控制台窗口
  • --lto=yes:启用链接时优化(Link Time Optimization),可以生成更小、更快的二进制文件。

4. 其他用途

编译 .py 文件为 .pyd

nuitka --module your_script.py

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python实现动态添加类的属性或成员函数的解决方法

    Python实现动态添加类的属性或成员函数的解决方法

    这篇文章主要介绍了Python实现动态添加类的属性或成员函数的解决方法,在类似插件开发的时候会比较有用,需要的朋友可以参考下
    2014-07-07
  • Linux下python3.7.0安装教程

    Linux下python3.7.0安装教程

    这篇文章主要为大家详细介绍了Linux下python3.7.0安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • python实现批量移动文件

    python实现批量移动文件

    这篇文章主要为大家详细介绍了python实现批量移动文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • python实现PyEMD经验模态分解残差量分析

    python实现PyEMD经验模态分解残差量分析

    这篇文章主要为大家介绍了PyEMD经验模态分解及变体残余量分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇

    这篇文章主要给大家介绍了关于Python描述数据结构学习之哈夫曼树篇的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 人工智能学习pyTorch自建数据集及可视化结果实现过程

    人工智能学习pyTorch自建数据集及可视化结果实现过程

    这篇文章主要为大家介绍了人工智能学习pyTorch自建数据集及可视化结果的实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • python读取txt文件并取其某一列数据的示例

    python读取txt文件并取其某一列数据的示例

    今天小编就为大家分享一篇python读取txt文件并取其某一列数据的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • 浅谈keras中loss与val_loss的关系

    浅谈keras中loss与val_loss的关系

    这篇文章主要介绍了浅谈keras中loss与val_loss的关系,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python numpy--数组的组合和分割实例

    python numpy--数组的组合和分割实例

    这篇文章主要介绍了python numpy--数组的组合和分割实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python中实现带权重的随机测试

    Python中实现带权重的随机测试

    本文主要介绍了Python中实现带权重的随机测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05

最新评论