Python 程序打包成可执行文件,适用windows,macos

文章介绍了如何使用PyInstaller进行Python应用的打包,包括使用-F或-D参数选择单文件或多文件打包,以及添加图标和设置导入路径等选项。此外,还提到了通过安装UPX进行文件压缩和在Pipenv虚拟环境中只安装必要依赖进行打包的方法,以减小打包后文件的大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于python打包的那点事儿

安装 pyinstaller 打包工具

pip install  pyinstaller

执行打包命令

 pyinstaller.exe -F -c --clean .\####.py

主要参数

  • -F, --onefile 打包一个单个文件,如果你的代码都写在了一个py文件的话,可以使用这个命令,如果是多个py文件,就别用;
  • -D, --onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架的形式编写工具代码,代码易于维护;
  • -a, --ascii 不包含unicode编码的支持(包括默认值:如果可用)
  • -c, --console 使用控制台子系统执行(默认),只对windows有效
  • -w, --windowed, --noconsole 使用windows子系统执行,当程序启动的时候不会打开命令行(只对windows有效)
  • -i , --icon=<File.ico>将file.ico添加为打包的exe文件的图表,只对windows系统有效
  • –icon=<File.exe,n>将file.exe的第n个图标添加为可执行文件的资源,只对windows系统有效
  • -n Name,–name=Name 可选的项目,生成的.spec文件的名字和exe名字
  • -p 设置导入路径(和使用PYTHONPATH效果相似),可以使用路径分隔符(windows使用分好,linux使用冒号),制定多个目录的时候可以指定多个-p参数来设置,让pyinstaller自己去找程序的资源
  • –key KEY 用于加密Python字节码的密钥
  • –add-data 可以将一些非二进制文件添加到exe文件中进行打包,参数为格式为static;static
  • –distpath 指定打包后的程序存放目录,exe文件默认存放在当前目录下的dist目录中
  • –workpath 为输出的所有临时文件指定存放目录,默认为当前目录下的build目录

打包后文件较大,有以下两种方式可以进行优化

1、安装upx

未安装的时候显示

在这里插入图片描述

安装后显示

在这里插入图片描述

windows下如何安装
  • (1) 到官网 https://upx.github.io/ 下载UPX, 下载下来是一个压缩包
  • (2) 解压得到 upx.exe文件
  • (3) 把upx.exe拷贝到这个目录中 C:\Users\admin\AppData\Roaming\Python\Python39\Scripts ;我的目录是这里
  • (4) 重启 cmd,再执行打包命令

2、使用 Pipenv 在虚拟机中进行打包,只安装必要的包

  • 安装 Pipenv
pip install pipenv
  • 进入虚拟机,输入这个命令,我们就进入到了新建的虚拟环境。如果你这时候使用命令 pip list 并发现里面只有很少的库,这就说明我们成功进入虚拟环境了
pipenv shell
  • 安装依赖库
pipenv install pyinstaller
。。。
。。。
。。。等等
  • 再次查看 pip list 时,如果都成功安装好了,我们就可以开始打包了

windows 与 macos都可以安装此工具,如果需要打包好的可执行文件在对应平台上运行,需要在各自平台进行打包,否则需要安装虚拟机(不推荐,特别麻烦)

<think>我们将使用PyInstaller来将Python程序打包Windows可执行文件(.exe)。以下是详细步骤和代码示例。 ### 解决方案 1. **安装PyInstaller**: 在命令行中运行: ``` pip install pyinstaller ``` 2. **基本打包命令**: 对于单个Python文件,使用以下命令: ``` pyinstaller --onefile --windowed your_script.py ``` - `--onefile`:将所有文件打包一个可执行文件。 - `--windowed`:对于图形界面程序,不显示命令行窗口(如果是命令行程序则去掉此选项)。 3. **添加图标(可选)**: 使用`--icon`参数指定图标文件(.ico格式): ``` pyinstaller --onefile --windowed --icon=your_icon.ico your_script.py ``` 4. **添加数据文件(如图片、音频等)**: 使用`--add-data`参数,格式为`源路径;目标路径`(Windows用分号分隔,Linux/macOS用冒号)。 ``` pyinstaller --onefile --windowed --add-data="assets;assets" your_script.py ``` 在代码中,需要使用以下方式处理资源路径: ```python import sys import os def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) # 使用示例 image_path = resource_path("assets/image.png") ``` 5. **隐藏控制台窗口(仅Windows)**: 如果程序是图形界面,使用`--windowed`。如果是控制台程序,则不需要。 ### 示例:打包桌面宠物程序 假设我们的桌面宠物程序名为`desktop_pet.py`,并且有一个`assets`文件夹存放资源。 打包命令: ``` pyinstaller --onefile --windowed --add-data="assets;assets" --icon=pet_icon.ico desktop_pet.py ``` ### 代码调整(资源路径处理) 在`desktop_pet.py`中,我们需要修改资源加载方式,使用`resource_path`函数: ```python import sys import os def resource_path(relative_path): """ 获取资源的绝对路径。用于PyInstaller打包后的路径定位 """ try: # PyInstaller创建的临时文件夹 base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 加载图片示例 # 原代码:pet_image = pygame.image.load('assets/pet.png') # 改为: pet_image = pygame.image.load(resource_path('assets/pet.png')) ``` ### 打包步骤 1. 将上述代码调整后,确保在开发环境下运行正常。 2. 准备图标文件(如`pet_icon.ico`),放在项目目录下。 3. 打开命令行,进入项目目录。 4. 执行打包命令。 5. 打包后,在`dist`文件夹中找到生的`.exe`文件。 ### 常见问题及解决 - **杀毒软件误报**:PyInstaller打包程序可能被误报为病毒,可以尝试添加数字签名或向杀毒软件提交误报。 - **文件太大**:使用虚拟环境安装仅需要的包,避免打包不必要的库。 - **缺少依赖**:确保所有依赖库都已正确安装,并在打包前测试。 ### 高级选项 - **指定输出目录**:使用`--distpath`指定输出目录。 - **版本信息**:使用`--version-file`指定版本信息文件(Windows下)。 - **UPX压缩**:使用UPX压缩可执行文件(需先下载UPX),添加`--upx-dir`参数。 ### 示例版本信息文件(version.txt) 创建一个文本文件`version.txt`,内容如下: ``` # UTF-8 # VSVersionInfo( ffi=FixedFileInfo( filevers=(1, 0, 0, 0), prodvers=(1, 0, 0, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( '040904B0', [StringStruct('CompanyName', 'Your Company'), StringStruct('FileDescription', 'Desktop Pet'), StringStruct('FileVersion', '1.0.0.0'), StringStruct('InternalName', 'DesktopPet'), StringStruct('LegalCopyright', 'Copyright © 2023 Your Company.'), StringStruct('OriginalFilename', 'DesktopPet.exe'), StringStruct('ProductName', 'Desktop Pet'), StringStruct('ProductVersion', '1.0.0.0')]) ]), VarFileInfo([VarStruct('Translation', [0, 1200])]) ] ) ``` 打包命令(加入版本信息): ``` pyinstaller --onefile --windowed --add-data="assets;assets" --icon=pet_icon.ico --version-file=version.txt desktop_pet.py ``` ### 总结 使用PyInstaller打包Python程序Windows可执行文件非常方便,但需要注意资源路径的处理和打包选项的配置。通过上述步骤,可以生一个独立的可执行文件,方便在Windows上分发运行。 §§相关问题§§: 1. 如何为PyInstaller打包程序添加数字签名? 2. 如何减少PyInstaller打包后的文件大小? 3. 如何使用PyInstaller打包多文件项目? 4. PyInstaller打包程序如何实现自动更新?</think># 将Python程序打包Windows可执行文件(.exe) 将Python程序打包Windows可执行文件是分发Python应用给非技术用户的最佳方式。下面我将详细介绍使用PyInstaller工具打包的完整方案。 ## 完整打包方案 ### 1. 安装PyInstaller ```bash pip install pyinstaller ``` ### 2. 创建简单的Python程序示例 创建一个名为`hello_pet.py`的文件: ```python import tkinter as tk from tkinter import messagebox import os def show_pet(): root = tk.Tk() root.title("桌面宠物") root.geometry("300x200") # 创建标签 label = tk.Label(root, text="🐾 可爱的桌面宠物 🐾", font=("Arial", 16)) label.pack(pady=20) # 创建退出按钮 exit_button = tk.Button(root, text="退出", command=root.destroy, bg="#ff9999") exit_button.pack(pady=10) # 创建信息按钮 info_button = tk.Button(root, text="关于", command=lambda: messagebox.showinfo("关于", "桌面宠物 v1.0\n作者: Python专家")) info_button.pack(pady=5) root.mainloop() if __name__ == "__main__": show_pet() ``` ### 3. 基本打包命令 ```bash pyinstaller --onefile --windowed hello_pet.py ``` ### 4. 完整打包脚本(包含图标和资源) 创建打包脚本`build.spec`: ```python # -*- mode: python ; coding: utf-8 -*- block_cipher = None # 添加资源文件 added_files = [ ('icon.ico', '.'), ('pet_sounds', 'sounds') ] a = Analysis( ['hello_pet.py'], pathex=[], binaries=[], datas=added_files, # 包含资源文件 hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='DesktopPet', # 输出文件名 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, # 使用UPX压缩 console=False, # 不显示控制台窗口 icon='icon.ico', # 设置图标 disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) ``` ### 5. 使用spec文件构建 ```bash pyinstaller build.spec ``` ## 打包后的文件处理 ### 1. 添加版本信息 创建`version_info.txt`文件: ``` # UTF-8 # VSVersionInfo( ffi=FixedFileInfo( filevers=(1, 0, 0, 0), prodvers=(1, 0, 0, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( '040904B0', [StringStruct('CompanyName', 'Your Company'), StringStruct('FileDescription', 'Desktop Pet Application'), StringStruct('FileVersion', '1.0.0.0'), StringStruct('InternalName', 'DesktopPet'), StringStruct('LegalCopyright', 'Copyright © 2023 Your Company'), StringStruct('OriginalFilename', 'DesktopPet.exe'), StringStruct('ProductName', 'Desktop Pet'), StringStruct('ProductVersion', '1.0.0.0')]) ]), VarFileInfo([VarStruct('Translation', [0, 1200])]) ] ) ``` 然后在spec文件中添加: ```python exe = EXE( # ... 其他参数 ... version='version_info.txt', # 添加版本信息 ) ``` ### 2. 处理资源路径 在Python代码中正确处理资源路径: ```python import sys import os def resource_path(relative_path): """获取资源的绝对路径""" try: # PyInstaller创建的临时文件夹 base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 使用示例 icon_path = resource_path('icon.ico') sound_path = resource_path('sounds/pet_sound.wav') ``` ## 高级打包技巧 ### 1. 创建安装程序 使用Inno Setup创建安装程序: 1. 下载Inno Setup: https://jrsoftware.org/isdl.php 2. 创建安装脚本`setup.iss`: ```iss [Setup] AppName=Desktop Pet AppVersion=1.0 DefaultDirName={pf}\DesktopPet DefaultGroupName=Desktop Pet UninstallDisplayIcon={app}\DesktopPet.exe Compression=lzma2 SolidCompression=yes OutputDir=.\dist OutputBaseFilename=DesktopPet_Setup [Files] Source: "dist\DesktopPet.exe"; DestDir: "{app}" Source: "sounds\*"; DestDir: "{app}\sounds" [Icons] Name: "{group}\Desktop Pet"; Filename: "{app}\DesktopPet.exe" Name: "{commondesktop}\Desktop Pet"; Filename: "{app}\DesktopPet.exe" [Run] Filename: "{app}\DesktopPet.exe"; Description: "运行桌面宠物"; Flags: postinstall nowait ``` ### 2. 使用UPX压缩 1. 下载UPX: https://upx.github.io/ 2. 解压并将upx.exe放在项目目录 3. 在spec文件中添加: ```python exe = EXE( # ... 其他参数 ... upx=True, # 启用UPX压缩 upx_exclude=[], # 排除某些文件 ) ``` ## 打包最佳实践 1. **使用虚拟环境**: ```bash python -m venv venv venv\Scripts\activate pip install pyinstaller pip install -r requirements.txt ``` 2. **减小可执行文件大小**: - 使用UPX压缩 - 排除不必要的库 - 使用`--exclude-module`参数 3. **测试打包结果**: - 在干净的Windows虚拟机中测试 - 检查所有资源路径是否正确 - 验证所有功能正常工作 ## 常见问题解决 1. **缺少DLL文件**: - 使用`--add-binary`参数添加DLL - 将DLL放在与exe相同的目录 2. **防病毒软件误报**: - 使用代码签名证书签名 - 向防病毒厂商提交误报 3. **控制台窗口闪烁**: - 确保使用`--windowed`参数 - 检查代码中是否有print语句 ## 完整工作流程 1. 开发Python应用 2. 创建spec文件配置打包选项 3. 使用PyInstaller打包 4. 使用UPX压缩可执行文件 5. 添加版本信息 6. 使用Inno Setup创建安装程序 7. 在干净环境中测试安装包 ## 代码签名(可选但推荐) ```bash # 使用signtool签名 signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com dist\DesktopPet.exe ``` ## 总结 使用PyInstaller打包Python程序Windows可执行文件是一个多步骤的过程,但通过合理的配置和优化,可以创建专业级的应用程序分发包。关键点包括:使用spec文件进行详细配置、正确处理资源路径、添加版本信息、使用UPX压缩,以及创建安装程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值