Pyinstaller打包exe后在其他PC提示Ghostscript未安装求助
问题原因与解决办法
核心原因
Camelot依赖Ghostscript的二进制文件,但Pyinstaller不会自动打包系统级的外部程序(比如Ghostscript);同时打包后的exe运行时会优先使用自身隔离的环境,可能无法正确识别同事电脑上全局安装的Ghostscript路径,哪怕已经添加到系统PATH。
解决方法
方法1:手动将Ghostscript打包进exe
- 找到你本地Ghostscript安装目录下的
bin和lib文件夹(例如C:\Program Files\gs\gsX.X.X\bin、C:\Program Files\gs\gsX.X.X\lib) - 修改Pyinstaller生成的spec文件,把这两个目录添加到
datas参数中:a = Analysis( ['你的脚本文件名.py'], datas=[ ('C:\\Program Files\\gs\\gsX.X.X\\bin', 'gs/bin'), ('C:\\Program Files\\gs\\gsX.X.X\\lib', 'gs/lib') ], # 其他原有参数保持不变 ) - 在你的Python脚本开头添加路径配置代码,让camelot能找到打包后的Ghostscript:
import os import sys from camelot import utils # 判断是否为打包后的运行环境 if getattr(sys, 'frozen', False): # 获取打包后Ghostscript的bin目录路径 gs_bin_path = os.path.join(sys._MEIPASS, 'gs', 'bin') # 将该路径加入系统PATH os.environ['PATH'] = gs_bin_path + os.pathsep + os.environ['PATH'] # 强制指定camelot使用的Ghostscript执行文件路径(32位系统替换为gswin32c.exe) utils._find_gs = lambda: os.path.join(gs_bin_path, 'gswin64c.exe') # 后续正常调用camelot的代码 import camelot tables = camelot.read_pdf('目标文件.pdf') - 基于修改后的spec文件重新打包:
pyinstaller 你的脚本文件名.spec
方法2:强制指定同事电脑上的Ghostscript路径
如果不想打包Ghostscript,可以让同事安装对应版本后,在脚本中直接写死路径:
from camelot import utils # 让同事替换为他本地Ghostscript的实际安装路径(32位系统替换为gswin32c.exe) utils._find_gs = lambda: 'C:\\Program Files\\gs\\gsX.X.X\\bin\\gswin64c.exe'
方法3:修复系统PATH读取问题
打包后的exe可能无法读取系统PATH的最新修改,可让同事:
- 安装Ghostscript后重启电脑再运行exe
- 或在exe快捷方式的属性中,手动将Ghostscript的bin目录添加到环境变量的PATH中
内容的提问来源于stack exchange,提问作者user22364063
相关产品推荐
相关产品推荐

