3

我试图找出一种简单的方法来执行我编写的 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"

有没有办法让 Gimp 从 Windows cmd shell 发出的命令中使用其 Python-Fu 模块执行 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)'
4

1 回答 1

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)"

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

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

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

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

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

于 2015-03-13T12:41:10.737 回答