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

How to Execute Python-Fu script from shell via Gimp

我试图找出一种简单的方法来执行我编写的 Python-Fu 脚本,该脚本在 Gimp 的 Python-Fu 解释器插件中以单线程模式工作,但是由于 Pool.map_async() 中弹出的 Windows 非 POSIX / OS.Fork 限制,在重构为多处理等效项时将不再工作。作为解决方法,我试图直接从 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"

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

只是为了增加背景知识,我从以下内容中汲取灵感 documentation...

GIMP Python Invocation from the Shell

All this means that you could easily invoke a GIMP Python plug-in such as the one above directly from your shell using the (plug-in-script- fu-eval …) evaluator:

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

您在 --batch 之后传递给 GIMP 的字符串本身在 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)"

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

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

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

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

但是由于性能是一个问题,我的方法是编写 GIMP-Python 过程来实例化 XMLRPC(或 JSONRPC) server and the outer, controlling script to call the "real" procedures through RPC. Using XMLRPC in Python is easy - less than 10 lines boilerplate code you can mostly copy and paste directly from the module docs in http://python.org。这样你就可以拥有一个池GIMO 进程准备好执行您的任务,通过简单、快速的 RPC 调用(每个逻辑核心一个 GIMP,当然,您必须在控制脚本上放置一些逻辑以 round-robin/queue 调用)。