我试图找出一种简单的方法来执行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从Windows cmd shell发出的命令中使用Python-Fu模块执行python脚本?
为了增加背景,我从以下documentation ...
中获取灵感来自Shell的GIMP Python调用
这一切意味着你可以 轻松直接调用上面的GIMP Python插件 从你的shell使用(plug-in-script-fu-eval ...)评估器:
gimp --no-interface --batch '(python-fu-console-echo RUN-NONINTERACTIVE "another string" 777 3.1416 (list 1 0 0))' '(gimp-quit 1)'
答案 0 :(得分:3)
在--batch
之后传递GIMP的字符串本身是在script-fu中执行的。
运行Python脚本的简单方法是编写一个脚本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中从命令提示符调用它的人必须找到一种创造性的方法来执行此操作。 (上面,它们使用\
)
那应该回答你的问题。但是,我会进一步挖掘: 除非您在脚本中执行的处理非常重,否则为每个脚本调用调用单独的GIMP实例的开销可能很大(我没有测量内存使用情况 - 我的i5每次调用大约需要2秒)任务被操作系统正确缓存后的非SSD机器 - 所以你可能也可以使用它。)
但我的方法,因为性能是个问题,就是编写GIMP-Python程序来实例化XMLRPC(或JSONRPC)服务器和外部控制脚本来调用“真正的”程序通过RPC。在Python中使用XMLRPC很简单 - 少于10行的样板代码,您可以直接从http://python.org中的模块文档复制和粘贴。通过这种方式,您可以通过一个简单,快速的RPC调用(每个逻辑核心一个GIMP,并且您必须在控制脚本上放置一些逻辑来循环/排队调用,)来准备好执行任务的GIMO流程池,当然)。