如何从命令行使用 gimpfu 运行 python 脚本? [英] How to run python scripts using gimpfu from command line?

查看:72
本文介绍了如何从命令行使用 gimpfu 运行 python 脚本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 gimp 2.8.22 的函数将 pdf 转换为 jpeg,我想使用我的 windows cmd 中的 gimpfu 库使用 python 脚本来做到这一点(我已经安装了 python 3.6.1).

I'm trying to use functions of gimp 2.8.22 to convert a pdf to jpeg and i want to do that with a python script using the gimpfu library from my windows cmd (i have installed python 3.6.1).

现在,我不想用示例脚本来做到这一点:

Right now, i't trying to do that with an example script:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world(initstr, font, size, color) :
    # First do a quick sanity check on the font
    if font == 'Comic Sans MS' :
        initstr = "Comic Sans? Are you sure?"

    # Make a new image. Size 10x10 for now -- we'll resize later.
    img = gimp.Image(1, 1, RGB)

    # Save the current foreground color:
    pdb.gimp_context_push()

    # Set the text color
    gimp.set_foreground(color)

    # Create a new text layer (-1 for the layer means create a new layer)
    layer = pdb.gimp_text_fontname(img, None, 0, 0, initstr, 10,
                                   True, size, PIXELS, font)

    # Resize the image to the size of the layer
    img.resize(layer.width, layer.height, 0, 0)

    # Background layer.
    # Can't add this first because we don't know the size of the text layer.
    background = gimp.Layer(img, "Background", layer.width, layer.height,
                            RGB_IMAGE, 100, NORMAL_MODE)
    background.fill(BACKGROUND_FILL)
    img.add_layer(background, 1)

    # Create a new image window
    gimp.Display(img)
    # Show the new image window
    gimp.displays_flush()

    # Restore the old foreground color:
    pdb.gimp_context_pop()

register(
    "python_fu_hello_world",
    "Hello world image",
    "Create a new image with your text string",
    "Akkana Peck",
    "Akkana Peck",
    "2010",
    "Hello world (Py)...",
    "",      # Create a new image, don't work on an existing one
    [
        (PF_STRING, "string", "Text string", 'Hello, world!'),
        (PF_FONT, "font", "Font face", "Sans"),
        (PF_SPINNER, "size", "Font size", 50, (1, 3000, 1)),
        (PF_COLOR, "color", "Text color", (1.0, 0.0, 0.0))
    ],
    [],
    hello_world, menu="<Image>/File/Create")

main()

我尝试像这样从我的 cmd 运行脚本:

I try to run the script from my cmd like this:

gimp-2.8 --no-interface --batch '(python_fu_hello_world RUN-NONINTERACTIVE "Hello" Arial 50 red)' -b '(gimp-quit 1)'

但是,无论我做什么,我总是收到相同的错误消息:

However, no matter what i do, i always geht the same error message:

(gimp-2.8:1020): LibGimpBase-警告**: gimp-2.8: gimp_wire_read():错误

(gimp-2.8:1020): LibGimpBase-WARNING **: gimp-2.8: gimp_wire_read(): error

好的,谢谢.我省略了 interface 语句,还尝试了最简单的示例来找出问题所在:

edit: Ok, thanks. I left out the interface statement and I also tried out the most simple example to figure out whats wrong:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world():
 gimp.message("Hello, GIMP world!\n")

register(
 "hello_world",
 'A simple Python-Fu "Hello, World" plug-in',
 'When run this plug-in prints "Hello, GIMP world!" in a dialog box.',
 "Tony Podlaski",
 "Tony Podlaski 2017. MIT License",
 "2017",
 "Hello World",
 "",
 [],
 [],
 hello_world,
 menu="<Image>/Filters/HelloWorld",
)

main()

当我从 Gimp 本身运行脚本时,该脚本实际上可以工作,但是当我尝试从我的 cmd 运行它时,Gimp 打开并显示另一个 cmd:Error: (:1) eval: unbound variable: hello_world

The script actually works when i run it from Gimp itself, but when i try to run it from my cmd, Gimp opens with another cmd saying: Error: ( : 1) eval: unbound variable: hello_world

有人知道我在这里缺少什么吗?

Does someone know what i'm missing here?

推荐答案

要运行 Python 脚本,您无需将其注册为插件.恕我直言,您甚至应该避免这种情况,这会不必要地污染 Gimp 的菜单和程序名称空间.下面是一个例子:

To run a python script you don't need to have it register as a plugin. IMHO you should even avoid this, this unnecessarily pollutes Gimp's menus and procedure name space. Here is an example:

批处理脚本(另存为batch.py​​):

The batch script (saved as batch.py):

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import os, glob, sys, time
from gimpfu import *


def process(infile):
        print "Processing file %s " % infile
        image = pdb.gimp_file_load(infile, infile, run_mode=RUN_NONINTERACTIVE)
        drawable = image.active_layer

        print "File %s loaded OK" % infile
        pdb.plug_in_photocopy(image, drawable,8.,0.8,0.2,0.2)
        pdb.plug_in_cartoon(image, drawable, 7.,0.2)
        outfile=os.path.join('processed',os.path.basename(infile))
        outfile=os.path.join(os.path.dirname(infile),outfile)
        print "Saving to %s" % outfile
        pdb.file_jpeg_save(image, drawable, outfile, outfile, "0.5",0,1,0,"",0,1,0,0)
        print "Saved to %s" % outfile
        pdb.gimp_image_delete(image)


def run(directory):
        start=time.time()
        print "Running on directory \"%s\"" % directory
#   os.mkdir(os.path.join(directory,'processed'))
        for infile in glob.glob(os.path.join(directory, '*.jpg')):
                process(infile)
        end=time.time()
        print "Finished, total processing time: %.2f seconds" % (end-start)


if __name__ == "__main__":
        print "Running as __main__ with args: %s" % sys.argv

调用它:

gimp -idf --batch-interpreter python-fu-eval -b "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')" -b "pdb.gimp_quit(1)"

慢动作参数:

  • -idf:在没有用户界面的情况下工作,既不加载数据也不加载字体(您可能需要保留字体以加载 pdf)
  • --batch-interpreter python-fu-eval:-b 后面的内容是 Python,而不是 script-fu
  • "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')":我们要求的代码要执行的 Gimp,即:
    • import sys;sys.path=['.']+sys.path;:扩展导入路径以包含当前目录
    • import batch;:使用我们的脚本导入文件,该文件现在位于作为路径一部分的目录中.
    • batch.run('./images'):调用我们导入的batch模块的run()函数,给它包含要处理的图像的目录的名称.
    • -idf: work without user interface, and load neither data nor fonts (you may perhaps need to keep the fonts to load pdfs)
    • --batch-interpreter python-fu-eval: whatever follows -b is Python, not script-fu
    • "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')": the code that we ask Gimp to execute, namely:
      • import sys;sys.path=['.']+sys.path;: extend the import path to include the current directory
      • import batch;: import the file with our script, which is now in a directory which is part of the path.
      • batch.run('./images'): call the run() function of the batch module we imported, giving it the name of a directory containing the images to process.

      注意命令行如何巧妙地使用双引号和单引号将所有参数传递给 Gimp,然后传递给 Python(*).是的,您可以在 Windows 中使用正斜杠作为文件分隔符.

      Note how the command line cleverly uses double and single quotes to pass all parameters to Gimp and then to Python(*). And yes, you can use forward slashes as file separators in Windows.

      要调试,Windows 中的事情有点复杂,因为并不总是有标准输出流.可以提供帮助的事情:

      To debug, matters are bit complicated in Windows because there is no always a stdout stream. Things that can help:

      • 暂时移除 -i 参数,以便您获得 UI,并可能有机会看到消息.
      • 添加 --verbose 使 Gimp 启动辅助控制台窗口.
      • 还有其他技巧可以查看此处.
      • 您也可以正常启动 Gimp 并从 Python-fu 控制台(过滤器>Python-fu>控制台)运行您的脚本.您将不得不扩展路径并手动"导入文件.
      • remove the -i parameter temporarily so that you get the UI and perhaps a chance to see messages.
      • Add --verbose which makes Gimp start a secondary console window.
      • There are other tricks to see messages listed here.
      • You can also start Gimp normally and run your script from the Python-fu console (Filters>Python-fu>Console). You will have to extend the path and import the file "manually".

      (*) 在 Linux/OSX shell 中,人们会做相反的事情:shell 用单引号,Python 用双引号.

      (*) In a Linux/OSX shell one would do the opposite: single quotes for the shell, double quotes for Python.

      这篇关于如何从命令行使用 gimpfu 运行 python 脚本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆