Ghostscript执行PostScript循环调用ImageMagick后退出问题求助
听起来你遇到的问题大概率是被调用的ImageMagick生成的PostScript文件里包含了终止Ghostscript的命令,或者外部工具调用导致主进程被中断。下面是几个针对性的解决思路:
1. 检查被调用的PostScript文件是否包含终止命令
这是最常见的原因:很多工具(包括ImageMagick)生成的PostScript文件,为了确保执行完成后清理资源,会在末尾加上quit或exit命令。当你用run或runlibfile加载这个文件时,执行到这条命令就会直接终止整个Ghostscript进程,自然没法回到主循环。
解决步骤:
- 打开你要调用的那个logo的PS文件,查看末尾几行代码。
- 如果发现
quit、exit或者stop这类命令,直接删除它们,或者用%注释掉(PostScript注释以%开头)。 - 重新保存文件后再测试循环调用。
2. 临时重定义终止命令,避免子文件退出主进程
如果你不想修改生成的PS文件(比如文件是自动生成的,每次都要改太麻烦),可以在主程序调用子文件前,临时重定义quit命令,让它变成空操作,调用完成后再恢复原命令。
示例代码:
% 保存原quit命令 /oldQuit /quit load def % 重定义quit为无操作(pop用来吃掉可能的参数) /quit { pop } def % 调用你的logo PS文件 runlibfile "your-logo-file.ps" % 恢复原quit命令 /quit oldQuit def
这样即使子文件里有quit,也不会终止Ghostscript,而是跳过这条命令,回到主循环继续执行。
3. 排查是否是外部工具调用导致的进程中断
如果你其实是通过PostScript的system命令间接调用ImageMagick的外部工具(比如display命令),而不是直接运行PS文件,那可能是外部工具的运行方式导致Ghostscript被中断:
- 比如在某些桌面环境下,
display工具会占用前台窗口,当你关闭窗口时,可能会发送信号终止父进程(Ghostscript)。 - 解决方法是让
display在后台运行:- Linux/macOS环境下,在命令里加
&:system "display your-logo.png &" - Windows环境下,用
start命令:system "start display your-logo.png"
display在后台显示图片。 - Linux/macOS环境下,在命令里加
4. 调整Ghostscript命令行参数强制不退出
可以尝试在启动Ghostscript时加上-dNOEXIT参数,这个参数会强制Ghostscript在执行完文件后不自动退出,而是回到交互模式(如果是交互式运行的话)。如果你的主循环是在交互式环境下运行的,这个参数可能会让Ghostscript在调用子文件后继续执行循环。
示例启动命令:
gs -dNOEXIT your-main-script.ps
5. 检查主程序的循环结构是否正确
最后,确认你的主循环逻辑没有问题:比如是不是用了正确的PostScript循环结构(比如loop、repeat或者自定义循环),有没有正确的条件判断来控制循环继续。不过根据你描述的“显示一次后退出”,大概率还是前面几个原因,但排查一下总没坏处。
内容的提问来源于stack exchange,提问作者user3694546

