Как запустить скрипты Python, используя gimpfu из командной строки Windows?

Я пытаюсь использовать функции gimp 2.8.22 для преобразования pdf в jpeg, и я хочу сделать это с помощью скрипта python, используя библиотеку gimpfu из моего windows cmd (у меня установлен python 3.6.1).

Прямо сейчас я не пытаюсь сделать это с помощью примера сценария:

#!/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 следующим образом:

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

Однако, что бы я ни делал, я всегда получаю одно и то же сообщение об ошибке:

(gimp-2.8: 1020): LibGimpBase-WARNING **: gimp-2.8: gimp_wire_read (): ошибка

редактировать: хорошо, спасибо. Я пропустил оператор интерфейса и также попробовал самый простой пример, чтобы выяснить, что не так:

#!/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

Кто-то знает, что мне здесь не хватает?

2 ответа

Решение

Для запуска скрипта Python вам не нужно регистрировать его как плагин. ИМХО, вам даже следует избегать этого, это излишне загрязняет меню Gimp и пространство имен процедур. Вот пример:

Пакетный скрипт (сохранен как 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.file_jpeg_load(infile,infile)
        drawable = pdb.gimp_image_get_active_layer(image)

        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 это питон, а не скрипт-фу
  • "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')": код, который мы просим Gimp выполнить, а именно:
    • import sys;sys.path=['.']+sys.path;: расширить путь импорта, чтобы включить текущий каталог
    • import batch;: импортировать файл с нашим скриптом, который сейчас находится в каталоге, который является частью пути.
    • batch.run('./images'): позвоните run() функция batch Модуль, который мы импортировали, дав ему имя каталога, содержащего изображения для обработки.
  • -b "pdb.gimp_quit(1)": другой кусок питона: выход, когда закончите.

Обратите внимание, как командная строка умело использует двойные и одинарные кавычки для передачи всех параметров в Gimp, а затем в Python(*). И да, вы можете использовать косую черту в качестве разделителей файлов в Windows.

Для отладки в Windows все немного сложнее, потому что не всегда есть поток stdout. Вещи, которые могут помочь:

  • удалить -i Параметр временно, так что вы получите пользовательский интерфейс и, возможно, шанс увидеть сообщения.
  • добавлять --verbose что заставляет Gimp запускать дополнительное окно консоли.
  • Есть другие приемы, чтобы увидеть сообщения, перечисленные здесь.
  • Вы также можете запустить Gimp в обычном режиме и запустить свой скрипт из консоли Python-fu (Фильтры>Python-fu> Консоль). Вам нужно будет расширить путь и импортировать файл "вручную".

(*) В оболочке Linux/OSX можно сделать наоборот: одинарные кавычки для оболочки, двойные кавычки для Python.

Поскольку используемый скрипт создает изображение, а затем показывает его в окне.... Но вы вызываете Gimp с --no-interface флаг, чтобы окно не показывалось.

ИМХО конвертировать из PDF в JPEG, ImageMagick's convert Команда будет намного проще.

Кроме того, в Windows Gimp поставляется со своим собственным встроенным интерпретатором Python 2.7, поэтому вы должны написать свой код Python для этой версии, и нет необходимости устанавливать другую.

Другие вопросы по тегам