打包配置
打包方法
方法一 直接打包
sh
pyinstaller --onefile script.py
方法二 通过配置spec文件打包
sh
pyinstaller script.spec
常见问题
问题1.Exception Type: FileNotFoundError
pyinstaller打包,如何添加静态文件,比如app\\resources\\data\\version_list.json
在使用PyInstaller打包Python应用程序时,添加静态文件(如app/resources/data/version_list.json
)可以通过以下几种方法实现:
方法1:使用--add-data
选项
这是最常用的方法,通过--add-data
选项可以指定要包含的文件及其目标路径。具体命令如下:
sh复制
pyinstaller --add-data "app/resources/data/version_list.json;app/resources/data" script.py
-
app/resources/data/version_list.json
是源文件的路径。 -
app/resources/data
是目标路径,即打包后文件在临时目录中的相对路径。 -
在Windows上,路径分隔符是
;
,在Linux和macOS上是:
。
方法2:编辑.spec
文件
如果你已经生成了.spec
文件,可以通过编辑该文件来添加静态文件。首先,使用以下命令生成.spec
文件:
sh复制
pyinstaller --onefile script.py
这将生成一个script.spec
文件。然后,编辑该文件,在Analysis
部分的datas
列表中添加你的文件:
Python复制
a = Analysis(['script.py'],...datas=[('app/resources/data/version_list.json', 'app/resources/data')],...)
最后,使用.spec
文件重新打包:
sh复制
pyinstaller script.spec
方法3:在代码中动态获取资源文件路径
为了确保程序在打包后能够正确找到资源文件,可以在代码中使用sys._MEIPASS
来动态获取资源文件的路径。以下是一个示例函数,用于获取资源文件的路径:
Python复制
import os
import sysdef get_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)# 使用示例
version_list_path = get_resource_path("app/resources/data/version_list.json")
这个函数会根据程序是直接从源代码运行还是从打包后的可执行文件运行,来返回正确的资源文件路径。
完整示例
假设你的项目结构如下:
复制
project/
│
├── app/
│ ├── resources/
│ │ └── data/
│ │ └── version_list.json
│ └── ui/
│ └── tool/
│ └── pc_decrypt/
│ └── pc_decrypt.py
│
└── main.py
你可以在main.py
中使用以下代码来获取version_list.json
文件的路径:
Python复制
import os
import sysdef get_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)# 使用示例
version_list_path = get_resource_path("app/resources/data/version_list.json")# 读取文件内容
with open(version_list_path, 'r') as file:version_list = file.read()print(version_list)
然后使用以下命令打包:
sh复制
pyinstaller --add-data "app/resources/data/version_list.json;app/resources/data" main.py
这样,打包后的可执行文件在运行时就能正确找到并读取version_list.json
文件了。
问题二 找不到模块
如果打包后运行提示找不到某些模块,可以:
使用 --hidden-import 参数手动添加
在spec文件中的 hiddenimports 列表中添加
问题三. 文件路径问题
在打包后的程序中,需要特别注意文件路径的处理:
import os
import sys
# 获取程序运行时的真实路径
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
else:
application_path = os.path.dirname(os.path.abspath(__file__))
问题四.减小文件体积
通过以下方法减小打包后的文件体积:
使用虚拟环境,只安装必要的依赖
使用 --exclude-module 排除不需要的模块
使用UPX压缩(如果可用)
注意事项
始终使用虚拟环境进行开发和打包
仔细检查依赖项,避免包含不必要的模块
在目标平台上测试打包后的程序
保存并管理spec文件,方便后续修改和重新打包
记录打包过程中的问题和解决方案