如何使用 PyInstaller 打包 Python 脚本?一看就懂的完整教程!
PyInstaller 打包指令教程
1. 写在前面
通常,在用 Python 编写完一个脚本后,需要将它部署并集成到一个更大的项目中。常见的集成方式有以下几种:
- 使用 PyInstaller 打包。
- 使用 Docker 打包。
- 将 Python 嵌入到 C++ 代码中,并封装成类。
- 将 Python 代码转换为 C++ 代码。
本文介绍其中一种方式——使用 PyInstaller 打包。通过 PyInstaller,可以将 Python 脚本打包成 .exe 文件(适用于 Windows)或适用于 macOS 和 Linux 的可执行文件,用户无需安装 Python 或任何相关依赖,便能直接运行程序。
主要优势:
- 将 Python 脚本打包成独立可执行文件,方便分发和运行。
- 支持单文件打包、图标定制、以及额外文件的捆绑。
- 可选隐藏控制台窗口,适合图形化应用(GUI)程序。
适用场景:
- 发布桌面工具或命令行程序。
- 让没有 Python 环境的用户也能使用你的工具。
- 分享自包含的 Python 项目,确保目标机器能够顺利运行。
2. 打包指令解析与参数详解
| 参数名 | 描述 | 示例 | 类型 | 必须 | 默认值 |
|---|---|---|---|---|---|
--onefile | 将所有依赖文件打包为单个可执行文件。 | pyinstaller --onefile example.py | bool | 否 | False |
--noconsole | 隐藏控制台窗口(适用于 GUI 应用)。 | pyinstaller --noconsole gui_app.py | bool | 否 | False |
--name | 指定生成的可执行文件名称。 | pyinstaller --name=my_app example.py | str | 否 | 源文件名(无扩展) |
--icon | 设置可执行文件的图标(需提供 .ico 文件)。 | pyinstaller --icon=app_icon.ico example.py | str | 否 | None |
--add-data | 捆绑额外文件(如配置文件、静态资源等)。 | pyinstaller --add-data "config.yaml;." example.py | str | 否 | None |
--clean | 清理之前的构建缓存,强制重新打包。 | pyinstaller --clean example.py | bool | 否 | False |
--hidden-import | 手动添加隐藏的依赖模块(通常是自动检测遗漏的依赖)。 | pyinstaller --hidden-import=requests example.py | list | 否 | 自动检测 |
3. 基础步骤
1. 安装 PyInstaller
在终端(或命令行)中运行以下命令,安装 PyInstaller:
pip install pyinstaller
2. 使用基础命令进行打包
假设你有一个 Python 脚本 example_script.py,使用下面的命令将其打包为一个独立的可执行文件:
pyinstaller --onefile example_script.py
- 该命令会将所有依赖项和代码打包成一个单一的
.exe文件。 - 打包后,可以在
dist目录下找到生成的可执行文件。
4. 常见的用法示例
示例 1:基础打包
将 example_script.py 打包为一个单文件可执行程序:
pyinstaller --onefile example_script.py
示例 2:自定义名称和图标
将输出文件命名为 my_program.exe,并指定图标文件为 app_icon.ico:
pyinstaller --onefile --name=my_program --icon=app_icon.ico example_script.py
示例 3:捆绑额外文件
将配置文件 config.yaml 一起捆绑进可执行文件:
pyinstaller --onefile --add-data "config.yaml;." example_script.py
注意:在 Windows 系统中,路径分隔符用分号 ;,而在 macOS/Linux 中使用冒号 :。
示例 4:解决缺失依赖问题
如果在运行时遇到某个模块丢失的错误,可以通过 --hidden-import 指定手动引入依赖:
pyinstaller --onefile --hidden-import=requests example_script.py
示例 5:隐藏控制台窗口
适用于图形界面(GUI)应用程序,运行时隐藏控制台窗口:
pyinstaller --onefile --noconsole gui_app.py
5. 注意事项(路径)
-
路径问题:使用
--add-data时,不同操作系统的路径分隔符需特别注意。- Windows:
"source;destination" - macOS/Linux:
"source:destination"
- Windows:
-
文件路径问题:在代码中访问本地文件时,使用相对路径获取的文件可能会在打包后无法找到。此时,建议使用以下方式获取正确的文件路径:
BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
6. 错误处理和日志记录
在打包的 Python 应用中,为了方便调试,可以加入错误处理代码,将错误信息记录到文件中,帮助定位问题。
try:# 代码逻辑pass
except Exception as e:print("An error occurred:", e)with open("error_log.txt", "w") as f:f.write(str(e))
如果可执行文件出现问题,能够在 error_log.txt 中查看详细的错误信息。
例如,

这就是一个文件路径错误的报错,原因在于生成的可执行文件是在 dist 目录下,但是文件路径是相对路径,在 ../ 上,知道问题就可以解决了。否则,有时候连报错都不知道在哪。
另外,如果想要更加优雅地打包python,建议配合以下教程食用:
Python 参数配置使用 XML 文件的教程:轻松管理你的项目配置
相关文章:
如何使用 PyInstaller 打包 Python 脚本?一看就懂的完整教程!
PyInstaller 打包指令教程 1. 写在前面 通常,在用 Python 编写完一个脚本后,需要将它部署并集成到一个更大的项目中。常见的集成方式有以下几种: 使用 PyInstaller 打包。使用 Docker 打包。将 Python 嵌入到 C 代码中,并封装成…...
解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统
目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…...
Hadoop、Hive、Spark的关系
Part1:Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架,一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程,map将一个任务分成多个小任务,reduce的部分将结果汇总之后返回。 3、HIv…...
基于VMware虚拟机的Ubuntu22.04系统安装和配置(新手保姆级教程)
文章目录 一、前期准备1. 硬件要求2. 软件下载2-1. 下载虚拟机运行软件 二、安装虚拟机三、创建 Ubuntu 系统虚拟机四、Ubuntu 系统安装过程的配置五、更换国内镜像源六、设置静态 IP七、安装常用软件1. 编译工具2. 代码管理工具3. 安装代码编辑软件(VIM)…...
Python|基于DeepSeek大模型,自动生成语料数据(10)
前言 本文是该专栏的第10篇,后面会持续分享AI大模型干货知识,记得关注。 在本专栏之前,笔者在文章《Python|基于DeepSeek大模型,实现文本内容仿写(8)》中,有详细介绍通过Python+DeepSeek大模型,实现对目标文本内容的仿写。 而在本文中,笔者将基于DeepSeek大模型,通…...
基于SpringBoot的历史馆藏系统设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
蓝桥杯[每日两题] 真题:好数 神奇闹钟 (java版)
题目一:好数 题目描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 )上的数字是奇数,偶数位(十位、千位、十万位 )上的数字是偶数,我们就称之为“好数”。给定…...
基于BMO磁性细菌优化的WSN网络最优节点部署算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 无线传感器网络(Wireless Sensor Network, WSN)由大量分布式传感器节点组成,用于监测物理或环境状况。节点部署是 WSN 的关键问…...
学习笔记:Python网络编程初探之基本概念(一)
一、网络目的 让你设备上的数据和其他设备上进行共享,使用网络能够把多方链接在一起,然后可以进行数据传递。 网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…...
Laya中runtime的用法
文章目录 0、环境:2.x版本1、runtime是什么2、使用实例情景需要做 3、script组件模式 0、环境:2.x版本 1、runtime是什么 简单来说,如果创建了一个scene,加了runtime和没加runtime的区别就是: 没加runtimeÿ…...
Docker中GPU的使用指南
在当今的计算领域,GPU(图形处理单元)已经成为了加速各种计算密集型任务的关键硬件,特别是在深度学习、科学模拟和高性能计算等领域。Docker作为流行的容器化平台,允许开发者将应用程序及其依赖打包成一个可移植的容器,在不同的环境中运行。当需要在Docker容器中利用GPU的…...
OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对选定区域内的梯度场应用适当的非线性变换,然后通过泊松求解器重新积分,可以局部修改图像的表观照明。 cv::illuminati…...
【爬虫】开篇词
一、网络爬虫概述 二、网络爬虫的应用场景 三、爬虫的痛点 四、需要掌握哪些技术? 在这个信息爆炸的时代,如何高效地获取和处理海量数据成为一项核心技能。无论是数据分析、商业情报、学术研究,还是人工智能训练,网络爬虫&…...
C#变量与变量作用域详解
一、变量基础 1. 声明与初始化 声明语法:<数据类型> <变量名>(如 int age; string name)初始化要求: 1、 类或结构体中的字段变量(全局变量)无需显式初始化,默认值…...
深度解析 slabtop:实时监控内核缓存的利器
文章目录 深度解析 slabtop:实时监控内核缓存的利器slabtop 简介基本语法与选项命令语法主要选项详解 实际应用实例示例 1:每 5 秒刷新显示 slab 缓存信息示例 2:按名称排序,每 10 秒刷新一次显示 slab 缓存信息 如何解读 slabtop…...
力扣-股票买入问题
dp dp元素代表最大利润 f[j][1] 代表第 j 次交易后持有股票的最大利润。在初始状态,持有股票意味着你花钱买入了股票,此时的利润应该是负数(扣除了买入股票的成本),而不是 0。所以,把 f[j][1] 初始化为负…...
微服务保护:Sentinel
home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多,比如: 请求限流 线程隔离 服务熔断 服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发…...
蓝桥杯刷题周计划(第二周)
目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...
【C++】C++11部分
目录 一、列表初始化 1.1 {}初始化 1.2 initializer_list 二、变量类型推导 2.1 auto 2.2 decltype 三、STL中一些变化 3.1 新增容器 四、lambda表达式 4.1 C98中的一个例子 4.2 lambda表达式 4.3 函数对象与lambda表达式 五、包装器 5.1 function包装器 5.2 fu…...
【分布式】聊聊分布式id实现方案和生产经验
对于分布式Id来说,在面试过程中也是高频面试题,所以主要针对分布式id实现方案进行详细分析下。 应用场景 对于无论是单机还是分布式系统来说,对于很多场景需要全局唯一ID, 数据库id唯一性日志traceId 可以方便找到日志链&#…...
[MERN] 使用 socket.io 实现即时通信功能
[MERN] 使用 socket.io 实现即时通信功能 效果实现如下: MERN-socket.io 实现即时聊天 Github 项目地址:https://github.com/GoldenaArcher/messenger-mern 项目使用了 MERN(MongoDB, Express, React, Node.js) socket.io 实现即时通信功能,并且使用了…...
c#面试题整理6
1.String类能否被继承,为什么 可以看到String类的修饰符是sealed,即是密封类,故不可被继承 2.一个对象的方法是否只能由一个线程访问 不是,但是可通过同步机制,确保同一个时间只有一个线程访问 3.计算2*8ÿ…...
简洁实用的3个免费wordpress主题
高端大气动态炫酷的免费企业官网wordpress主题 非常简洁的免费wordpress主题,安装简单、设置简单,几分钟就可以搭建好一个wordpress网站。 经典风格的免费wordpress主题 免费下载 https://www.fuyefa.com/wordpress...
Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
一:背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章,这是一个故意引发的正向泄露,这一篇我们从逆向的角度去洞察引发泄露的祸根代码,这东西如果在 windows 上还是很好处理的,很多人知道…...
【HDLbits--counter】
HDLbits--counter 在IC设计中,counter是十分普遍和重要的设计内容; 题目:基础计数器 module top_module (input clk,input reset,output [9:0] q);always (posedge clk) beginif(reset) beginq < 0;end else beginif(q999) beginq < 0…...
nvm 让 Node.js 版本切换更灵活
有很多小伙伴前端开发进程中,我们常常会遇到不同项目依赖不同版本 Node.js 的情况。我们不可能去卸载重新安装适应的版本去安装依赖或者启动项目。为了避免版本冲突带来的一系列麻烦,在这里给大家推荐一款Node.js 版本管理工具——nvm(Node V…...
双向选择排序算法
一 概述 双向选择排序(又称鸡尾酒选择排序)是选择排序的优化版本,核心改进在于每轮遍历同时确定未排序部分的最小值和最大值,分别交换到序列两端,从而减少遍历轮数。 二 时间复杂度 时间复杂度为(O(n^2)),但实际比较次数约为标准选择排序的 (1/2)。 三 C++实现代…...
美畅物联丨P2P系列之STUN服务器:助力网络穿透
在当今WebRTC等实时通信应用广泛兴起的复杂网络环境下,如何在NAT(网络地址转换)环境中实现高效、稳定的点对点(P2P)连接成为关键。STUN(Session Traversal Utilities for NAT)服务器作为应对这一…...
基于SpringBoot的“积分制零食自选销售平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“积分制零食自选销售平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 局部E-R图 系统首页界面…...
DeepSeek-V3 技术报告解读
DeepSeek火了有一段时间了,春节假期因为没时间,所以关于deepseek大模型一系列的技术报告一直没看,新年开工后,抽一点时间把之前的坑补起来,关于DeepSeek-V3技术报告的解读已经有很多了,但我相信不同的人去读…...
