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

3

我正在尝试找出一种简单的方法来执行我编写的Python-Fu脚本,该脚本在Gimp的Python-Fu解释器插件中以单线程模式工作,但当重构为其多进程等效形式时,由于Windows非POSIX / OS.Fork限制,在Pool.map_async()中会出现问题。 作为解决方法,我正在尝试直接从命令行窗口调用脚本,但是无法找到正确的命令来完成它。 我已将gimp二进制文件目录添加到PATH变量中,并尝试像以下内容一样实现某些内容...

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

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

仅为了增加背景,我从以下文档中获取灵感...

从Shell调用GIMP Python

所有这些意味着您可以轻松地使用(插件脚本-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)'
1个回答

5

在使用--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)"

除了使用脚本-fu表达式"(python-fu-gradient-save-as-css ... )"之外,您还应该注意以下几点:
  • 使用-n确保在新的GIMP实例中运行它(也许根本不需要-但在这里对我起作用)
  • 在脚本-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),你必须在控制脚本上放置一些逻辑来轮询/排队调用,当然。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接