如何通过 Gimp 从 shell 执行 Python-Fu 脚本

jxr*_*mos 3 python shell gimp python-fu

我试图找出一种简单的方法来执行我编写的 Python-Fu 脚本,该脚本在 Gimp 的 Python-Fu 解释器插件的单线程模式下工作,但由于Windows 非 POSIX/OS.Fork 限制在Pool.map_async(). 作为一种解决方法,我试图直接从 cmd shell 调用脚本,但无法找出正确的命令来完成它。我的 PATH 变量中有 gimp bin 目录,我正在尝试实现如下所示的内容...

c:\>gimp-console-2.8 --no-interface --batch "(python-fu execfile('myPyFuScript.py'))"
c:\>gimp-console-2.8 --no-interface --batch "myPyFuScript.py"
Run Code Online (Sandbox Code Playgroud)

有没有办法让 Gimp 使用它的 Python-Fu 模块从 Windows cmd shell 发出的命令中执行 python 脚本?

只是为了增加背景,我从以下文档中汲取灵感......

来自 Shell 的 GIMP Python 调用

所有这一切意味着您可以使用 (plug-in-script-fu-eval ...) 评估器直接从您的 shell 轻松调用 GIMP Python 插件,例如上面的插件:

gimp --no-interface --batch '(python-fu-console-echo RUN-NONINTERACTIVE "another string" 777 3.1416 (list 1 0 0))' '(gimp-quit 1)'
Run Code Online (Sandbox Code Playgroud)

jsb*_*eno 5

您之后传递 GIMP 的字符串--batch本身在 script-fu 中执行。运行 Python 脚本的最简单方法是编写一个 script-fu 表达式来调用您的 Python 过程。例如:

gimp  -n --no-interface --batch "(python-fu-gradient-save-as-css  RUN-NONINTERACTIVE \"Sunrise\" \"/tmp/grad.css\")" --batch "(gimp-quit 1)"
Run Code Online (Sandbox Code Playgroud)

除了使用 script-fu 表达式之外,"(python-fu-gradient-save-as-css ... )"您还应该注意以下几点:

  • 使用-n来确保它在新的 GIMP 实例中运行(也许这根本不需要 - 它在这里对我有用)
  • 使用双引号 ( ") 在 script-fu 字符串中分隔字符串参数。单引号在 scheme/script-fu 中有不同的句法含义。
  • 需要调用gimp-quit 1- 否则,即使使用--no-interface --batch,GIMP也会继续运行。

由于您将从外部 Python 脚本调用 GIMP,因此转义 GIMP"不是问题 - 但是从 Windows 中的命令提示符调用它的人必须找到一种创造性的方法来做到这一点。(上面,它们在 bash shell 中使用 进行了转义\

那应该回答你的问题。但是,我将进一步挖掘:除非您在脚本中进行的处理非常繁重,否则为每个脚本调用调用单独的 GIMP 实例的开销可能很大(我没有测量内存使用情况 - 它在任务被操作系统正确缓存后,在我的 i5 非 SSD 机器上每次调用大约需要 2 秒 - 所以你不妨忍受它)。

但是我的方法是,因为性能是一个问题,所以将编写 GIMP-Python 过程来实例化 XMLRPC(或JSONRPC)服务器和外部控制脚本以通过 RPC 调用“真实”过程。在 Python 中使用 XMLRPC 很容易——不到 10 行样板代码,您可以直接从http://python.org的模块文档中复制和粘贴 。这样你就可以有一个 GIMO 进程池准备好执行你的任务,通过一个简单、快速的 RPC 调用(每个逻辑核心一个 GIMP,你必须在控制脚本上放置一些逻辑来循环/排队调用,当然)。