PyInstaller打包生成.exe文件时提示JSON文件未找到的问题求助
解决PyInstaller打包时找不到JSON文件的问题
我来帮你搞定这个打包报错的问题——你遇到的script 'C:\Users\username\cs-new-success-c50837cb5b30.json;.' not found错误,根源是PyInstaller的--add-data参数格式解析失败,和你代码里的路径处理逻辑关系不大,咱们一步步来修复:
1. 修正打包命令的--add-data参数
在Windows系统下,PyInstaller的--add-data参数需要用;分隔「源文件路径」和「目标目录」,但你原来的命令里,PyInstaller错误地把整个C:\Users\username\cs-new-success-c50837cb5b30.json;./当成了一个要查找的脚本文件。
你可以把命令改成下面两种写法之一:
写法一:使用相对路径(推荐,因为文件和脚本在同一目录)
C:\Users\username>pyinstaller --onefile --icon=xross.ico --noconsole --hidden-import babel.numbers --add-data "cs-new-success-c50837cb5b30.json;." xrosscustomer01.py
写法二:使用绝对路径
C:\Users\username>pyinstaller --onefile --icon=xross.ico --noconsole --hidden-import babel.numbers --add-data "C:/Users/username/cs-new-success-c50837cb5b30.json;." xrosscustomer01.py
注意:把Windows的反斜杠
\换成正斜杠/,可以避免PyInstaller解析路径时出现转义问题;目标目录用.表示程序运行时的当前工作目录(打包后会对应sys._MEIPASS临时目录)。
2. 保留你的resource_path路径处理函数
你之前写的resource_path函数是正确的,它能自动适配开发环境和打包后的环境,一定要保留这个逻辑:
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) if __name__ == "__main__": import gspread from oauth2client.service_account import ServiceAccountCredentials scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] credentials = ServiceAccountCredentials.from_json_keyfile_name( resource_path('cs-new-success-c50837cb5b30.json'), scope) gc = gspread.authorize(credentials) # 后续业务逻辑...
3. 备选方案:直接修改.spec文件打包
如果修改命令后还是不行,可以手动编辑PyInstaller生成的xrosscustomer01.spec文件,确保datas列表正确添加了你的JSON文件:
打开.spec文件,找到a = Analysis(...)部分,修改datas参数:
a = Analysis( ['xrosscustomer01.py'], pathex=['C:\\Users\\username'], binaries=[], datas=[('C:\\Users\\username\\cs-new-success-c50837cb5b30.json', '.')], # 其他参数保持不变... )
然后用这个.spec文件重新打包:
C:\Users\username>pyinstaller xrosscustomer01.spec
额外检查点
- 确认JSON文件名完全正确(你的文件名很长,容易出现拼写错误,比如多了/少了字符)
- 确保JSON文件确实在
C:\Users\username目录下,没有被误放到子文件夹里
这样操作后,打包应该就能正常完成,而且运行打包后的程序时也能正确找到JSON文件了。
内容的提问来源于stack exchange,提问作者Aspi.Lon




